Отсутствует вывод условного поиска
Я пытаюсь построить условный оператор для поиска файлов определенного размера (в данном случае 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
и поместите результаты в переменную, затем, если переменная содержала что-либо, сохраните это в файл журнала.