Видалення файлів старше X днів +


143

Я знайшов команду видалити файли старші 5 днів у папці

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

Але як я також це роблю для підкаталогів у цій папці?


Ви маєте на увазі файли всередині підкаталогів? чи самі підкаталоги?
rahul

3
find /path/to -type d -empty -delete
Костас

2
Видаліть файли в підкаталогах, яким також більше 5 днів
Teddy291

3
Можливо, весело, коли у мене є файли з пробілами. Напр. Файл, який називається "тестувати один", і rm подається rm test one. (Який видалить файл під назвою "тест" та файл під назвою "один", але не файл з назвою "перевірити один"). Підказка: -delete or -print0
Hennes

6
В якості бічної зауваження завжди цитуйте аргументи, подані,find щоб уникнути проблем зі спеціальними символами, про що йдеться у першому рядку відповіді. Напр .:find /path/to/files/ -exec somecommand '{}' \;
Walf

Відповіді:


240

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

Є безпечна альтернатива - варіант -delete :

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

Це все, немає окремого виклику rm, і вам не потрібно турбуватися про імена файлів.

Замінити -deleteз , -depth -printщоб перевірити цю команду , перш ніж запустити його ( -deleteмає на увазі -depth).


23
Також використовуйте лише -type fдля видалення файлів (і зберігайте підкаталоги)
Олег

3
Крім того, якщо ви хочете зробити те ж саме для всіх файлів НОВОГО, ніж п’ять днів: знайдіть / шлях / до / каталог / -mindepth 1 -mtime -5 -delete
zmonteca

Якщо мій шлях містить пробіли, як мені це зробити? find /path/to/dir\ with\ spaces/ -mindepth 1 -mtime +5 -delete?
Патрік Грегоріо

3
@ uom-pgregorio Я б запропонував поставити шлях у лапки.
атрип

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
Відповідь Per @ 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 вище.


4
Зауважте, що для кожного файлу ви будете виконувати команду rm. Якщо у вас 1000 файлів старше 5 днів, то rm розпочнеться 1000 разів. З цієї причини розгляньте варіант -delete як у коментарі Коста або -exec rm {} \ +
Hennes

@Hennes: - 1) не впевнений, що +в цьому випадку потрібно втекти . - 2) краще написати, -exec rm '{}' +щоб відстоювати зло файлів із спеціальними символами (пробіли, нові рядки тощо) на їх ім'я.
Cbhihe

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.