Я использую 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 {} \;