Назад | Перейти на главную страницу

Сделать поиск успешным, даже если нет подходящих файлов

я использую 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