Граціозно видалення файлів старше 30 днів


8

У мене є папка кешу з мінімум 15000 файлами.

Я спробував це:

find cache* -mtime +30 -exec rm {} \;

Але це змусило моє серверне навантаження літати до неба!

Чи є швидше / краще рішення?

Або я можу обмежити швидкість або ітерації цієї команди?


1
Якщо cache*розширюється на багато файлів, ви можете спробувати щось подібне find . -name 'cache*' -mtime +30 -exec rm {} \;.
Яап Старійшина

Відповіді:


10

Мені подобається використовувати tmpwatchдля цих речей, це востаннє файл був змінений. Це просто і добре працює в багатьох випадках:

tmpwatch -m 720 /path/to/cache

Для Ubuntu перевірте tmpreaperзамість цього.

Якщо ви хочете перевірити останній доступ до файлу, використовуйте наступне:

tmpwatch -a 720 /path/to/cache

Ви не можете використовувати tmpwatch -a у файлових системах, встановлених у режимі часу. ви все одно можете використовувати -m


Я використовую, Ubuntu 10.04.2 LTSі ця команда не існує ..
Крістіан

2
@Kristian Check tmpreaperзамість цього.
slhck

Будь-які підводні камені під час використання цих даних для управління файловими системами, встановленими з опцією часу роботи?
AnonymousLurker

@AnonymousLurker Я змінив відповідь для вас
WojonsTech

6

Ви можете уникнути нересту нового процесу для кожного файлу, використовуючи

find cache* -mtime +30 -delete

3

Спробуйте виконати вищезазначене з приємним:

nice -n 39 find cache* -mtime +30 -exec rm -f {} ';'

Таким чином величезне навантаження з’явиться лише в тому випадку, якщо більше нічого не потрібно запускати, інакше інші процеси матимуть перевагу (якщо їх приємність нижча за 19, тобто максимум).

Зауважте, що аргумент до параметра -n додається до приємності за замовчуванням, яка коливається в межах від -20 до 19. Я використав 39, так що це буде дуже приємно незалежно від того, яка оригінальна приємність там була.


2

Як зауважив чіборг, завантаження пов'язане із запуском rm для кожного знайденого файла. Я помітив відповідь, де tmpwatchпропонується як альтернатива, що, я впевнений, працює добре. Однак це не обов’язково.

Find може запустити команду, виконану для виконання, один раз, якщо ви скажете їй акумулювати знайдені файли у список таких аргументів:

find /path -name "*.moo" -exec rm {} \+

Іноді це може не спрацювати, оскільки список аргументів може зрости більшим (у байтах), ніж максимально дозволений оболонкою (getconf ARG_MAX). Це може бути вирішено xargs з опцією -L.

розглянемо цей приклад:

$ echo 0 > /tmp/it; 
$ for i in {0..15000};do echo $i;done  |\
    xargs --no-run-if-empty -L 5000 ./tmp/xr.sh 
Iteration=0; running with 5000 arguments
Iteration=1; running with 5000 arguments
Iteration=2; running with 5000 arguments
Iteration=3; running with 1 arguments

$ cat tmp/xr.sh 
#!/bin/sh
IT=`cat /tmp/it`
echo Iteration=$IT\; running with $# arguments
let IT=IT+1
echo $IT > /tmp/it

Тому не потрібно встановлювати додаткове програмне забезпечення, все що вам потрібно - це у gnu-findutils:

find /path -mtime +30 -print0 | xargs -0 -L 5000 rm 

деякі d00d вважають, що було б корисно додати -print0 та -0 для пошуку та xargs. Ці аргументи змушують їх команди використовувати null char (\ 0) замість нового рядка (\ n) для розділення аргументів. Це корисно, коли в назви файлу є пробіли або нові рядки.
Ярослав Рахматуллін

(1) Вам не потрібно говорити \+; рівнина +досить хороша. (2) Це "не спрацює, оскільки список аргументів може зрости великим ...".  find  … -exec … {} +зробить те саме, що xargsзробить; вона виконає команду стільки разів, скільки потрібно. Наприклад (як у вашому прикладі), якщо у вас від 15001 до 20000 файлів, програма "d" ( ) findбуде запущена чотири рази. -execrm
G-Man каже: "Відновіть Моніку"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.