1

У меня это работает как cron работа

/usr/bin/find /backups/* -mtime +5 -exec rm -rf {} \;

Но это дает мне эту ошибку по электронной почте

/usr/bin/find: `/backups/Jun-20-2014': No such file or directory

Есть ли способ игнорировать эту ошибку, не перенаправляя вывод ошибки

4 ответа4

1

Это уродливый обходной путь, но он сработал для меня в нескольких случаях ...

Вы можете сохранить вывод команды в var, перенаправив вывод в stdout , например так:

result=$( <your find command here> 2>&1 )

Так как find ничего не выдает в случае успеха, любая ошибка отправляется в stderr а вывод, сохраненный в result является только тем, что отправляется в stdout , мы перенаправляем stderr в stdout чтобы зафиксировать ошибку на $result , затем вы можете проверить, что $result пусто (успех) или нет (произошла ошибка). Таким образом, вы можете сделать свой код, чтобы отправить вам почту соответственно:

if [ -z "$result" ]; then
    # If $result is empty, find was successful
else
    # The result is not empty because there was
    # an error, send a mail to notify.
fi

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

1

Используйте xargs как это:

find /backups/ -mtime +5 -print0 | xargs -0 rm -rf

-0 здесь для правильной обработки имен файлов с пробелами. Обратите внимание, что это будет работать намного быстрее, чем find -exec потому что он попытается поместить много файлов в один вызов rm .

0

Кажется, что файл существует, когда оболочка расширяется * но его больше нет, когда find его обрабатывает.

Вы можете попробовать с:

/usr/bin/find /backups/ -depth 1 -mtime +5 -exec rm -rf {} \;

Это обработает все файлы в /backups/ backups/ и с -depth 1 исключая сам начальный каталог.

0

Это не проблема. find предварительно обрабатывает части дерева, и когда он пытается получить доступ к уже удаленным файлам, он выдает stderr.

Вы можете просто игнорировать ошибки, -prune каталог или перейти в DFS привязку, т. Е. Одно из следующих

/usr/bin/find /backups/ -mtime +5 -exec rm -rf {} + 2>/dev/null
/usr/bin/find /backups/ -mtime +5 -prune -exec rm -rf {} +
/usr/bin/find /backups/ -depth -mtime +5 -exec rm -rf {} +

+ можно использовать для команд, которые принимают несколько аргументов, поэтому вам не нужно запускать больше rm, чем требуется

Настоящая проблема связана с использованием mtime . Я предполагаю, что вы хотите сделать, это удалить файлы, которые не были изменены в течение последних пяти дней. Затем вы должны явно удалить только файлы, то есть один из следующих

/usr/bin/find /backups/ -type f -mtime +5 -exec rm -f {} +
/usr/bin/find /backups/ -type f -mtime +5 -delete

И после слов вы можете включить вторую команду поиска для удаления пустых каталогов, то есть одну из следующих

/usr/bin/find /backups/ -mindepth 1 -type d -empty -delete
/usr/bin/find /backups/ -mindepth 1 -type d -empty -exec rm -rf {} +

Проблема с удалением каталогов на основе mtime, mtime будет меняться только тогда, когда файлы будут перемещены в / из каталога. Но в нем все еще могут быть файлы, которые были изменены в течение последних пяти дней, несмотря на то, что время модификации было более старым.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .