Как проверить, не нашла ли команда find ничего (bash, openSUSE)?

Я знаю, что можно использовать для цикла с командой find, как это

for i in `find $something`; do (...) done

но я хочу использовать команду find с "if".

Я пытаюсь создать комментарии прогресса (и файлы журнала позже) об удаленных файлах моим скриптом. Мне нужно проверить, если

find /directory/whatever -name '*.tar.gz' -mtime +$DAYS

нашли что-то или нет. Если нет, я хочу сказать echo "у вас нет файлов старше $ DAYS days" или что-то в этом роде ;)

Как я могу сделать это в shell-скрипт?

5 ответов


подсчитайте количество выходных строк и сохраните его в переменной, затем проверьте его:

lines=$(find ... | wc -l)
if [ $lines -eq 0 ]; then
...
fi

вы хотите использовать найти команда внутри an если условие , вы можете попробовать этот вкладыш :

 [[ ! -z `find 'YOUR_DIR/' -name 'something'` ]] && echo "found" || echo "not found"

пример использования :

 [prompt] $ mkdir -p Dir/dir1 Dir/dir2/ Dir/dir3                 
 [prompt] $ ls Dir/
 dir1  dir2  dir3
 [prompt] $ [[ ! -z `find 'Dir/' -name 'something'` ]] && echo "found" || echo "not found"
 not found
 [prompt] $ touch Dir/dir3/something
 [prompt] $ [[ ! -z `find 'Dir/' -name 'something'` ]] && echo "found" || echo "not found"
 found

выход 0 легко найти, выход >0 сложнее, потому что это обычно происходит только с ошибкой. Однако мы можем это сделать:

if find -type f -exec false {} +
then
  echo 'nothing found'
else
  echo 'something found'
fi

Я хотел сделать это в одной строке, если это возможно, но не видел способа заставить find изменить свой код выхода, не вызывая ошибки.

однако, с вашим специфическим требованием, следующее должно работать:

find /directory/whatever -name '*.tar.gz' -mtime +$DAYS | grep 'tar.gz' || echo "You don't have files older than $DAYS days"

это работает, передавая вывод find в grep для того же, возвращает код выхода из строя, если он ничего не находит, или будет успешным и Эхо найденных строк, если это так.

все, что после || только выполняется, если предыдущая команда не выполняется.


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

results=( $(find -name "$something") )
if (( ${#results[@]} )) ; then
    echo Found
else
    echo Not found
fi
for file in "${results[@]}" ; do
   # ...
done