Удалить файлы старше X дней +

143

Я нашел команду для удаления файлов старше 5 дней в папке

find /path/to/files* -mtime +5 -exec rm {} \;

Но как мне это сделать для подкаталогов в этой папке?

Teddy291
источник
Вы имеете в виду файлы внутри подкаталогов? или сами подкаталоги?
Рахул
3
find /path/to -type d -empty -delete
Костас
2
Удалить файлы в подкаталогах, которые также старше 5 дней
Teddy291
3
Возможно весело, когда у меня есть файлы с пробелами. Например, файл с именем «test one» и rm получает информацию rm test one. (Который удалит файл с именем «test» и файл с именем «one», но не файл с именем «test one»). Подсказка: -delete или -print0
Hennes
6
В качестве примечания всегда указывайте аргумент, указанныйfind во избежание проблем со специальными символами, как указано в первой строке ответа. Например:find /path/to/files/ -exec somecommand '{}' \;
Уолф

Ответы:

240

Будьте осторожны со специальными именами файлов (пробелы, кавычки) при передаче в rm.

Существует безопасная альтернатива - опция -delete :

find /path/to/directory/ -mindepth 1 -mtime +5 -delete

Вот и все, нет отдельного вызова rm, и вам не нужно беспокоиться об именах файлов.

Замените -deleteна, -depth -printчтобы проверить эту команду перед ее запуском ( -deleteподразумевается -depth).

basic6
источник
23
Также используйте -type fдля удаления только файлов (и хранения подкаталогов)
Олег
3
В качестве альтернативы, если вы хотите сделать то же самое для всех файлов, НОВЫХ, чем за пять дней: find / path / to / directory / -mindepth 1 -mtime -5 -delete
zmonteca
Если мой путь содержит пробелы, как я должен это сделать? find /path/to/dir\ with\ spaces/ -mindepth 1 -mtime +5 -delete?
Патрик Грегорио
3
@ uom-pgregorio Я бы предложил поставить путь в кавычках.
atripes
4
Обратите внимание, что каждый findаргумент является фильтром, который использует результат предыдущего фильтра в качестве входных данных. Поэтому убедитесь, что вы добавили -delete в качестве последнего аргумента. IE: find . -delete -mtime +5удалит ВСЕ в текущем пути.
Йохан
15

Обратите внимание, что эта команда не будет работать, если она найдет слишком много файлов. Это приведет к ошибке вроде:

bash: /usr/bin/find: Argument list too long

Это означает, что предел системного вызова exec для длины командной строки был превышен. Вместо выполнения rm таким способом гораздо эффективнее использовать xargs . Вот пример, который работает:

find /root/Maildir/ -mindepth 1 -type f -mtime +14 | xargs rm

Это приведет к удалению всех файлов (тип f), измененных более 14 дней назад в / root / Maildir /, оттуда и глубже (mindepth 1). Смотрите руководство по поиску для получения дополнительных опций .

Юлий
источник
7
В ответе @ AfshinHamedi на AskUbuntu ( askubuntu.com/questions/589210/removing-files-older-than-7-day ) будьте осторожны с файлами, содержащими символы новой строки и специальные символы. Вместо этого используйтеfind /root/Maildir/ -mindepth 1 -type f -mtime +14 -print0 | xargs -r0 rm --
Cbhihe
2
Или просто добавьте «+» к результатам поиска
Dani_l
8

Это то же самое. Вы просто должны предоставить родительский каталог, а не префикс файлов. В вашем примере это будет:

find /path/to -type f -mtime +5 -exec rm {} \;

Это удалит все файлы старше 5 дней, которые находятся под /path/toи его подкаталоги.

Чтобы удалить пустые подкаталоги, обратитесь к комментарию @Costas выше.

apaul
источник
4
Обратите внимание, что для каждого файла вы будете выполнять команду rm. Если у вас 1000 файлов старше 5 дней, rm запустится 1000 раз. По этой причине рассмотрите опцию -delete как в комментарии Косты или -exec rm {} \ +
Hennes
@Hennes: - 1) не уверен, что тебе нужно сбежать +в этом случае. - 2) лучше писать, -exec rm '{}' +чтобы отразить зло файлов со специальными символами (пробелы, переводы строк и т. Д.) В их имени.
Cbhihe
-1
find . -mtime +3 -type f -not -name '*pid*' |xargs rm -rf
Susil
источник