У меня есть каталоги, названные как:
2012-12-12
2012-10-12
2012-08-08
Как бы я удалил каталоги старше 10 дней скриптом оболочки bash?
ctime
время смены инода Для каталога это изменяется, когда файлы добавляются или удаляются из каталога.
У меня есть каталоги, названные как:
2012-12-12
2012-10-12
2012-08-08
Как бы я удалил каталоги старше 10 дней скриптом оболочки bash?
ctime
время смены инода Для каталога это изменяется, когда файлы добавляются или удаляются из каталога.
Ответы:
Это сделает это рекурсивно для вас:
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
методе.
В современных версиях find
вы можете заменить на ;
with, +
и он сделает xargs
для вас эквивалент вызова, передав столько файлов, сколько поместится в каждом системном вызове exec:
find . -type d -ctime +10 -exec rm -rf {} +
-mtime
было лучше для меня, так как он проверяет изменения содержимого, а не изменения разрешений, в противном случае это было идеально.
find /path/to/base/dir/*
.
-mindepth 1
(а не /path/to/folder/*
).
Если вы хотите удалить все подкаталоги /path/to/base
, например, в
/path/to/base/dir1
/path/to/base/dir2
/path/to/base/dir3
но вы не хотите удалять корень /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
Выше раствор не используется , -maxdepth 0
потому find
что жалуются каталог не пустой. Вместо этого он подразумевает -depth
и удаляет снизу вверх.
-delete
работу, но, как вы сказали, вы можете использовать ее только для удаления пустых каталогов, как rmdir
.
Я изо всех сил пытался получить это право, используя сценарии, представленные выше, и некоторые другие сценарии, особенно когда в именах файлов и папок были символы новой строки или пробелы.
В конце концов наткнулся на tmpreaper, и до сих пор он работал довольно хорошо для нас.
tmpreaper -t 5d ~/Downloads
tmpreaper --protect '*.c' -t 5h ~/my_prg
Исходная ссылка
Имеет такие функции, как тест, который рекурсивно проверяет каталоги и перечисляет их. Возможность удаления символических ссылок, файлов или каталогов, а также режим защиты для определенного шаблона при удалении
ИЛИ
rm -rf `find /path/to/base/dir/* -type d -mtime +10`
Обновленная, более быстрая версия этого:
find /path/to/base/dir/* -mtime +10 -print0 | xargs -0 rm -f
xargs --show-limits
.
-print0
/ -0
заботиться о специальных символах оболочки, или нет?
xargs
версия будет @mpen, но первая строка - нет.
find
мог сделать это, не глядя на имя тогда ...