Проверьте, удалены ли файлы

Я использую bash и rsync для создания и хранения резервных копий моего сайта. Я храню их в папках с датами ‘ dd-mm-yyyy ‘.

Я экспериментировал со следующим, чтобы удалить эти папки, если они старше x дней (в настоящее время 2, но будут дольше).

 find /path/to/files -type d -mtime +2 -name [0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9] -exec rm -rf {} \; -prune 

Вышеуказанное работает, но просто хочу перепроверить, я не делаю здесь что-то явно не так.

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

Мне интересно, если это будет так просто, как что-то вроде следующего, чтобы проверить, если правда:

 if find /path/to/files -type d -mtime +2 -name [0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9] -exec rm -rf {} \; -prune; then ... fi 

Но тогда я не уверен, как вывести пути к папкам, которые были удалены.

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

Если вы хотите, чтобы find распечатал имя -print файла, вставьте -print как действие. Вы можете -prune несколько действий (например, -print , -exec и -prune просто помещая их одно за другим).

 find /path/to/files -type d -mtime +2 -name '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' -print -exec rm -rf {} \; -prune 

Обратите внимание, что вам нужны кавычки вокруг шаблона, переданного -name . В противном случае, если в текущем каталоге находится соответствующий файл, shell раскроет этот шаблон до find как find его увидит.

Если вы хотите напечатать имя каждого удаленного файла, а не только каталог верхнего уровня каждой резервной копии, и вы используете Linux (точнее, если вы используете GNU coreutils), вы можете передать флаг -v в rm ,

Обратите внимание, что отправленная вами команда рекурсивно ищет подходящие каталоги в каталоге /path/to/files , а не только на верхнем уровне. Я не уверен, что это то, что вы хотели; например, это будет выглядеть внутри недавних резервных копий. Если вы хотите сопоставлять только каталоги верхнего уровня, самый простой способ – передать -maxdepth 1 , и тогда вам не нужен -prune .

 find /path/to/files -maxdepth 1 -type d -mtime +2 -name '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' -print -exec rm -rf {} \; 

В качестве альтернативы, вы можете позволить оболочке соответствовать именам каталогов и указать find никогда не выполнять -prune применив -prune перед сопоставлением.

 find /path/to/files/[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9] -prune -type d -mtime +2 -print -exec rm -rf {} \; 

Но это приведет к ошибке, если нет файлов, соответствующих шаблону, или если существует так много соответствующих файлов, что их объединенные имена превышают максимальную длину командной строки. Подход -maxdepth не имеет этих недостатков.

Если вы хотите записать, какие файлы были удалены, перенаправьте вывод в файл.

 { echo "# Deletions on $(date)" find /path/to/files -type d -mtime +2 -name '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' -print -exec rm -rf {} \; -prune echo } >>backup-deletions.log 

Если вы беспокоитесь о том, чтобы удалить неправильную вещь, запись о том, что вы удалили, даст вам знать, только когда будет слишком поздно. Вы можете сделать поэтапное удаление, сначала переместив вещи в «мусорное ведро», а позже опустошив мусорное ведро.

 # Move things to trash. Use whatever criteria you want. find /path/to/files -type d -mtime +2 -name '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' -exec mv {} /path/to/trash \; -prune # Delete directories from the trash can if they were moved more than # a week ago. find /path/to/trash -mindepth 1 -maxdepth 1 -ctime +7 -exec rm -rf {} \;