Сценарій Bash для видалення файлів старших x днів із підкаталогами


37

Я намагаюся видалити тону файлів старше x днів.

Тепер у мене є сценарій для цього

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

Але це також видалить підкаталоги. Є маса папок, але я хотів би зберегти їх і видалити файли, старші ніж на 10 днів, у цих папках.

Чи є спосіб це зробити?

Відповіді:


50

type опція для фільтрації результатів

findприймає typeопцію для вибору, наприклад, лише файлів.

find /path/to/files -type f -mtime +10 -delete

Вийдіть, -deleteщоб показати, що воно видалить, і як тільки ви це підтвердите, продовжуйте і виконайте повну команду.

Це працюватиме лише у файлах, а не в каталогах. Використовуйте -type dдля зворотного, лише перелічуючи каталоги, які відповідають вашим аргументам.


Додаткові параметри

Можливо, ви захочете прочитати man find, оскільки в майбутньому є кілька додаткових варіантів. Наприклад, -maxdepthдозволить вам обмежувати знайдені елементи лише певною глибиною, наприклад -maxdepth 0, не повторюватиметься у підкаталогах.

Деякі зауваження

  • Цікаво, як команда видалила б папку, оскільки ви не можете видалити лише папку rm. Вам знадобиться rm -rдля цього.

  • Також /path/to/files*заплутано. Ви мали на увазі /path/to/files/чи очікуєте, що підстановка розшириться на кілька імен файлів і папок?

  • Помістіть {}одинарні лапки, тобто, '{}'щоб уникнути інтерпретації імені файлу / каталогу, що інтерпретується оболонкою, так само, як ми захищаємо крапку з комою за допомогою косої риски.


Ну, є багато папок у / path / to / files / насправді я хотів би запустити mtime +10 -exec rm до кожної з цих папок, але зберігати самі папки, в основному я хотів би досягти цього - видалити всі файли старші 10 днів і зберігають усі папки. Я новачку вибачте, що новинка :)
JoyIan Yee-Hernandez

Ну ось, ви йдете :) Просто зробіть find /path/to/files* -type f -mtime +10і подивіться, що б вийшло .
slhck

Так, коли ви сумніваєтесь, не робіть цього -exec, просто подивіться, що він знайде.
Роб

2
@ JoyIanYee-Hernandez Ви також можете використовувати -deleteаргумент до find, який видаляє всі файли та папки, остання лише у випадку, якщо вони порожні. Це передбачає -depth, тобто пошук на глибині першого.
Даніель Бек

1
@Kreker Потім потрібно додати, -mindepth 1щоб виключити батьківський каталог.
slhck

5

Як і в попередніх відповідях (+1 для обох), хитрість полягає у використанні -type fпредиката.

Зауважте, що замість -exec rm '{}'вас також можна використовувати -deleteприсудок. Але не робіть цього. З -exec rm '{}'вами ви можете (і повинні) спочатку зробити, -exec echo rm '{}'щоб переконатися, що це дійсно те, що ви хочете. Після цього повторіть команду без echo.

Використання -deleteшвидше (без зайвих fork()та execve()для кожного файлу), але це ризиковано, оскільки -deleteпрацює також як умова, тому:

# delete *.tmp files
find . -type f -name '*.tmp' -delete

але якщо ви САМО міняєте аргументами:

# delete ALL files
find . -type f -name '*.tmp' -delete

Якщо вам коли-небудь потрібно findі rmпрацювати швидше для тонни файлів, ознайомтеся з find ... | xargs ... rmідіомою UNIX.


4
Я думаю, що ваші два останні приклади абсолютно однакові, можливо, ви хочете це виправити!
slhck

1

Ви можете легко зробити це за допомогою команди find

$ find -type f

Що обмежує результати, які мають бути типовими файлами


1

Я намагався отримати це право, використовуючи вищезазначені сценарії та деякі інші сценарії, особливо коли в іменах файлів і папок був новий рядок або пробіли.

Нарешті натрапили на tmpreaper, і це було досить добре для нас дотепер.

tmpreaper -t 5d ~/Downloads


tmpreaper  --protect '*.c' -t 5h ~/my_prg

Посилання на оригінальне джерело

Є такі функції, як тест, який рекурсивно перевіряє каталоги та перераховує їх. Можливість видалення посилань, файлів чи каталогів, а також режим захисту певного шаблону під час видалення


0

Для прискорення використання команди використовуйте '+'замість\;

find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'

Це буде працювати rmлише один раз наприкінці замість кожного разу, коли файл буде знайдений.
( rmможе запускатися кілька разів, якщо у вас дійсно багато файлів через обмеження довжини командного рядка, але це все ще майже так само швидко, як і використання -delete)


0

rm -f find /path/to/files -type file -mtime -5

Це видалить файли, які були змінені протягом 5 днів

rm -f find /path/to/files -type file -mtime +5

Це видалить файли, які були змінені протягом 5 днів

Використовуйте `перед знаходженням і наприкінці після 5.

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