я использую find
в сценарии bash для очистки некоторых кешированных файлов старше одного дня:
find /tmp/my_files_*.cache -mtime +1 -delete
Проблема в том, что если команда не соответствует ни одному файлу, она терпит неудачу, что препятствует выполнению остальной части скрипта:
find: `/tmp/my_files_*.cache': No such file or directory
В настоящее время я работаю над этим, добавляя || true
к команде, но это неоптимально, поскольку ошибка все еще появляется в выходных данных и позволяет сценарию продолжить работу после любой другой ошибки, которая find
может бросить.
Как я могу сказать find
что нормально, если не совпадают файлы?
find /tmp -name "*.cache" -mtime +1 -delete
С вашей исходной командой это на самом деле не find
это не соответствует чему-либо, кроме вашей оболочки.
Т.е. когда ты бежишь
find /tmp/my_files_*.cache -mtime +1 -delete
Если были совпадающие файлы, функция подстановки оболочки расширяла этот подстановочный знак и фактический find
вызов будет выглядеть примерно так:
find /tmp/my_files_1.cache /tmp/my_files_2.cache /tmp/my_files_3.cache -mtime +1 -delete
(это может легко стать очень длинная команда, которая в некоторых случаях может быть проблемой сама по себе)
Если совпадений нет, подстановочный знак передается как есть, поэтому find
вызов будет выглядеть так:
find /tmp/my_files_*.cache -mtime +1 -delete
и ведет себя как большинство программ find
не выполняет никаких подстановочных знаков самостоятельно для аргументов пути, поэтому пытается найти файл / каталог, который буквально назван /tmp/my_files_*.cache
, отсюда и ошибка.
Как указал Ипор Сирсер, более идиоматичный способ использования find
вместо этого дать ему базовый путь (пути) и позволить find
сам просматривает содержимое каталога и при необходимости применяет фильтры.
Что-то вроде этого должно соответствовать тому, что вы пытались сделать:
find /tmp -maxdepth 1 -name "my_files_*.cache" -mtime +1 -delete
Если вас не волнует, есть ли какие-либо файлы для удаления или нет, тогда не беспокойтесь о том, чтобы проверить успешность или нет, просто выбросьте любую ошибку:
найти /tmp/my_files_*.cache -mtime +1 -delete 2> / dev / null