Я пытаюсь создать условный оператор для поиска файлов определенного размера (в этом случае 1 ГБ.
if [ "find /location/sub/int/ -size +1G" ]
then
> /location/sub/int/large_file_audit.txt
fi
Я выполняю это, и это создает файл, но файл пуст, как я могу заставить результаты находки заполнять в файл? что я делаю неправильно?
Ваш тест 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
Это корректно не обработает имена файлов, содержащие новые строки - с более новыми версиями удара, Вы могли сделать 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 (Ложь), когда файлы не обрабатываются правильно ни по какой причине, таким образом, я предлагаю использовать что-то как:
#!/bin/bash
RESULTS=$(find /path -size +1G)
if [ -n "$RESULTS" ];
then
echo "$RESULTS" > /path/file.log
fi
Первый показ find
и помещенный результаты в переменную, затем если переменная содержала что-нибудь, сохраняют это в файл журнала.