Отсутствует вывод условного поиска

Я пытаюсь построить условный оператор для поиска файлов определенного размера (в данном случае 1 Гб.

if [ "find /location/sub/int/ -size +1G" ]
then
  > /location/sub/int/large_file_audit.txt
fi

Я запускаю это, и он создает файл, но файл пуст, как я могу получить результаты поиска, чтобы заполнить файл? Что я делаю неправильно?

2 ответа

Ваш тест if [ "find /location/sub/int/ -size +1G" ] не работает так, как вы собираетесь, потому что он проверяет не пустоту строки "find /location/sub/int/ -size +1G" - что всегда будет правдой. В любом случае перенаправление > /location/sub/int/large_file_audit.txt не будет волшебным образом получать стандартный вывод предыдущей команды, поэтому всегда будет создавать пустой файл.

Возможно, самым близким к вашему намерению в Bash было бы поместить результаты find в массив, а затем проверьте, есть ли в нем какие-либо элементы:

mapfile -t files < <(find /location/sub/int/ -size +1G)

if (( ${#files[@] > 0 )); then 
  printf '%s\n' "${files[@]}" > /location/sub/int/large_file_audit.txt
fi

Это не будет корректно обрабатывать имена файлов, содержащие переводы строк - с более новыми версиями bash вы можете сделать find а также mapfile с нулевым разделителем, но если вы выводите их в виде списка с новой строкой, то особой выгоды нет.

Один обходной путь лайнера:

find -size +10G | grep ".*" > file.log || (rm file.log; echo "Can't find anything")

Или же:

find -size +10G | grep ".*" > file.log || rm file.log

Обратите внимание, что find возвращает 1 (False), когда файлы по какой-либо причине обрабатываются некорректно, поэтому я предлагаю использовать что-то вроде:

#!/bin/bash
RESULTS=$(find /path -size +1G)
if [ -n "$RESULTS" ];
 then
   echo "$RESULTS" > /path/file.log
fi

Сначала запустите find и поместите результаты в переменную, затем, если переменная содержала что-либо, сохраните это в файл журнала.

Другие вопросы по тегам