Поиск и удаление файлов старше 30 дней

Я ищу, чтобы очистить файлы пользователей старше 30 дней. Следующий скрипт bash отлично работает. Тем не менее, я ищу, чтобы удалить ошибку «Нет такого файла или каталога», показанной на выходе, поскольку у меня есть собственное эхо. Может ли кто-нибудь помочь?

Код:

if [[ $(find /h/$USER/*.txt -mtime +30) ]] then find /h/$USER/*.txt -mtime +30 -print -exec rm -f {} \; else echo "No txt files to del" fi 

Вывод:

 find: stat() error /h/username/*.txt: No such file or directory No text files to del 

Проблема заключается в том, что вы используете оболочки globs вместо find для перечисления файлов txt (это также исключает скрытые файлы txt, и если какие-либо файлы .txt имеют тип каталога, он будет спускаться в них, чтобы удалить все старые файлы там). Оболочки, такие как bash , когда glob не соответствует ни одному файлу, передают glob asis, чтобы find и find жалобы на этот несуществующий файл *.txt .

Вы можете просто сделать:

 LC_ALL=C find "/h/$USER/." ! -name . -prune \ -name '*.txt' ! -type d -mtime +30 -print -exec rm -f {} + | grep '^' > /dev/null || echo >&2 No text files to del 

grep должен проверить, не find ли find какой-либо вывод (без ошибок), поэтому мы выводим текстовые файлы No для сообщения del, если это не так (удалите > /dev/null если вы хотите видеть файлы, которые мы пытаемся удалить ). Обратите внимание, что мы теряем статус выхода find в процессе.

Вы также можете использовать zsh чьи шарики могут проверять возраст файлов (вы уже используете синтаксис zsh , не цитируя этот $USER ):

 oldfiles=(/h/$USER/*.txt(NDm+30^/)) if (($#oldfile)); then rm -f -- $oldfiles else echo >&2 No text files to del fi 

Команда find обычно требует определенного типа (f для файла, d для каталога, b для блочного устройства, c для символа и т. Д.), Связанных с вашим поиском, если вы аннотируете wild cards. Для этой ситуации может быть более целесообразным также использовать цикл for, а не оператор if, также используя параметр -max-depth, возможно, полезно для поиска скрытых файлов /

Код:

  for i in $(find /h/$USER/ -type f -name "*.txt" -mtime +30 2> /dev/null); do rm -rf $i 2> /dev/null; done