
Нашел несколько похожих вопросов, но они не совсем совпадают.
У меня есть каталог для резервных копий (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
.