Изящно удаляя файлы старше 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 в файловых системах, смонтированных с noatime. вы все еще можете использовать -m


Я использую, Ubuntu 10.04.2 LTSи эта команда не существует ..
Кристиан

2
@Kristian Проверьте tmpreaperвместо этого.
slhck

Есть ли подводные камни при их использовании для управления файловыми системами, смонтированными с опцией noatime?
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

Как прокомментировал chiborg, загрузка происходит из-за запуска rm для каждого найденного файла. Я заметил ответ, где tmpwatchпредлагается в качестве альтернативы, который, я уверен, работает хорошо. Однако это не обязательно.

Find может выполнить команду, заданную для exec, один раз, если вы скажете ей накапливать найденные файлы в список аргументов следующим образом:

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. Эти аргументы заставляют их команды использовать пустой символ (\ 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.