У меня есть каталоги, названные так:
2012-12-12
2012-10-12
2012-08-08
Как удалить каталоги старше 10 дней с помощью bash оболочки script?
У меня есть каталоги, названные так:
2012-12-12
2012-10-12
2012-08-08
Как удалить каталоги старше 10 дней с помощью bash оболочки script?
Это будет рекурсивно для вас:
find /path/to/base/dir/* -type d -ctime +10 -exec rm -rf {} \;
Объяснение:
find: команда unix для поиска файлов/каталогов/ссылок и т.д./path/to/base/dir: каталог для начала поиска.-type d: найти только каталоги-ctime +10: учитывайте только те, у кого время модификации старше 10 дней.-exec ... \;: для каждого найденного результата выполните следующую команду в ...rm -rf {}: рекурсивно принудительно удалите каталог; часть {} - это то, где результат поиска заменяется на предыдущую часть.В качестве альтернативы используйте:
find /path/to/base/dir/* -type d -ctime +10 | xargs rm -rf
Это немного более эффективно, потому что оно равно:
rm -rf dir1 dir2 dir3 ...
в отличие от:
rm -rf dir1; rm -rf dir2; rm -rf dir3; ...
как в методе -exec.
Примечание. Также см. комментарий @MarkReed ниже относительно предпочтительного использования с современной версией find.
Если вы хотите удалить все подкаталоги в /path/to/base, например
/path/to/base/dir1
/path/to/base/dir2
/path/to/base/dir3
но вы не хотите удалять root /path/to/base, вам нужно добавить опции -mindepth 1 и -maxdepth 1, которые будут иметь доступ только к подкаталогам под /path/to/base
-mindepth 1 исключает корень /path/to/base из совпадений.
-maxdepth 1 будет ТОЛЬКО сопоставлять подкаталоги непосредственно в /path/to/base, такие как /path/to/base/dir1, /path/to/base/dir2 и /path/to/base/dir3, но он не будет перечислять их подкаталоги рекурсивным образом. Поэтому эти подкаталоги примера не будут перечислены:
/path/to/base/dir1/dir1
/path/to/base/dir2/dir1
/path/to/base/dir3/dir1
и т.д.
Итак, чтобы удалить все подкаталоги в /path/to/base, которые старше 10 дней,
find /path/to/base -mindepth 1 -maxdepth 1 -type d -ctime +10 | xargs rm -rf
find поддерживает операцию -delete, поэтому:
find /base/dir/* -ctime +10 -delete;
Я думаю, что есть уловка, что файлы должны быть на 10 + дней старше. Не пробовал, кто-то может подтвердить в комментариях.
Самое проголосовавшее решение здесь отсутствует -maxdepth 0, поэтому он будет вызывать rm -rf для каждого подкаталога после его удаления. Это не имеет смысла, поэтому я предлагаю:
find /base/dir/* -maxdepth 0 -type d -ctime +10 -exec rm -rf {} \;
-delete не использует это, потому что find будет жаловаться, что каталог не пуст. Вместо этого он подразумевает -depth и удаляет снизу вверх.
Я пытался сделать это правильно, используя приведенные выше сценарии и некоторые другие скрипты, особенно когда имена файлов и папок имели новую строку или пробелы.
Наконец-то наткнулся на tmpreaper, и до сих пор он работал очень хорошо.
tmpreaper -t 5d ~/Downloads
tmpreaper --protect '*.c' -t 5h ~/my_prg
Исходный источник ссылка
Имеет такие функции, как test, который рекурсивно проверяет каталоги и перечисляет их. Возможность удаления символических ссылок, файлов или каталогов, а также режим защиты для определенного шаблона при удалении
ИЛИ
rm -rf `find /path/to/base/dir/* -type d -mtime +10`
Обновлена, более быстрая версия:
find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f