Удалить только файлы старше 7 дней: -mtime и find

Удалить только файлы старше 7 дней: -mtime и find

Нашел несколько похожих вопросов, но они не совсем совпадают.

У меня есть каталог для резервных копий (sql), и я хочу удалить в нем все файлы старше 7 дней, оставив все подкаталоги нетронутыми.

Вот что у меня есть:

find /var/log/mbackups -mtime +7 -type f -delete

Правильный ли это способ достичь того, чего я хочу?

решение1

Ваша команда проверит каталог верхнего уровня /var/log/mbackups, а также спустится в любые подкаталоги, удаляя файлы, соответствующие критерию семи дней. Она не удалит сами каталоги.

Если вы хотите, чтобы команда просматривала файлы только в /var/log/mbackupsкаталоге, ине спускаться в подкаталоги, вам необходимо добавить это ограничение:

find /var/log/mbackups -maxdepth 1 -mtime +7 -type f -delete

В общем случае вы можете проверить findкоманду, заменив -deleteдействие чем-то безобидным, например -print(вам -depthтакже нужно здесь, как -deleteследует -depth):

find /var/log/mbackups -depth -mtime +7 -type f -print

решение2

С zsh:

rm -f /var/log/mbackups/*(.m+6)

такой же как:

rm -f /var/log/mbackups/*(.^m-7)

Удалил бы обычные (с .) файлы, которые не скрыты и не были изменены за последние 7 дней. Как и для find, -mtime +7сопоставил m+7бы файлы, возраст которых, округленный до следующего целого числа дней, строго больше 7, поэтому сопоставил бы файлы, которым 8 дней или больше (распространенная ошибка при работе с find).

Чтобы также удалить старые скрытые файлы, добавьте Dквалификатор glob.

Если нет соответствующего файла, вы получите сообщение об ошибке. Вы можете избежать этого, добавив Nквалификатор glob (и rmтогда он будет вызван без аргумента filename, но с -f, он не должен жаловаться на это).

решение3

Отказ от ответственности: Я являюсь текущим автором rawhide (rh) (см.https://github.com/raforg/rawhide)

Почти. Очень близко. Правильная версия вашей попытки:

find /var/log/mbackups -maxdepth 1 -mtime +6 -type f -delete

Если вы найдетенаходитьаргумент предиката -mtimeнедостаточно интуитивен, вы могли бы использоватьсыромятная кожа(рч) вместо:

rh -UUU -r /var/log/mbackups 'f && old(7*days)'

-UUUотменяет/удаляет/удаляет совпадения.

-rкакнаходить's -mindepth 1 -maxdepth 1и выполняет поиск только на один уровень ниже пути(ей) поиска, поэтому подкаталоги не просматриваются.

fсоответствует обычным файлам.

old(7*days)соответствует вещам, которые были изменены не менее 7 дней назад.

решение4

Предупреждение: -deleteнестандартно (непереносимо) и рискованно при использовании gfind.

Помните, что rmу него есть некоторые ограничения безопасности, но на gfindстранице руководства такие ограничения для не упоминаются -delete. Поэтому я рекомендую использовать официальный метод:

find /var/log/mbackups -mtime +7 -type f -exec rm {} +

Это даже не медленнее, чем нестандартный метод с использованием -delete.

Связанный контент