Suppression gracieuse de fichiers de plus de 30 jours

8

J'ai un dossier de cache avec au moins 15000 fichiers.

J'ai essayé ceci:

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

Mais cela a fait voler ma charge de serveur vers le ciel!

Existe-t-il une solution plus rapide / meilleure ?

Ou puis-je limiter la vitesse ou les itérations de cette commande?

Kristian
la source
1
Si elle cache*s'étend à de nombreux fichiers, vous pouvez essayer quelque chose comme à la find . -name 'cache*' -mtime +30 -exec rm {} \;place.
Jaap Eldering

Réponses:

10

J'aime utiliser tmpwatchpour ces choses, c'est la dernière fois que le fichier a été modifié. C'est simple et fonctionne bien dans de nombreux cas:

tmpwatch -m 720 /path/to/cache

Pour Ubuntu, cochez tmpreaperplutôt.

Si vous souhaitez vérifier la dernière fois que le fichier a été accédé, vous utilisez ce qui suit:

tmpwatch -a 720 /path/to/cache

Vous ne pouvez pas utiliser tmpwatch -a sur des systèmes de fichiers montés avec noatime. vous pouvez toujours utiliser -m

WojonsTech
la source
J'utilise Ubuntu 10.04.2 LTSet cette commande n'existe pas ..
Kristian
2
@Kristian Vérifiez tmpreaperplutôt.
slhck
Des pièges lors de leur utilisation pour gérer les systèmes de fichiers montés avec l'option noatime?
AnonymousLurker
@AnonymousLurker J'ai modifié la réponse pour vous
WojonsTech
6

Vous pouvez éviter la création d'un nouveau processus pour chaque fichier en utilisant

find cache* -mtime +30 -delete
chiborg
la source
3

Essayez d'exécuter ce qui précède avec nice:

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

De cette façon, l'énorme charge n'apparaîtra que si rien d'autre n'a besoin d'être exécuté, sinon les autres processus auront la priorité (si leur gentillesse est inférieure à 19, c'est-à-dire le maximum).

Notez que l'argument de l'option -n est ajouté à la gentillesse par défaut qui varie entre -20 et 19. J'ai utilisé 39 pour que ce soit très agréable quelle que soit la gentillesse d'origine.

DanielFetchinson
la source
2

Comme l'a commenté chiborg, la charge est due au démarrage de rm pour chaque fichier trouvé. J'ai remarqué que la réponse tmpwatchest suggérée comme alternative, ce qui, j'en suis sûr, fonctionne bien. Cependant, ce n'est pas nécessaire.

Find peut exécuter la commande donnée à exec une fois, si vous lui demandez d'accumuler les fichiers trouvés dans une liste d'arguments comme ceci:

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

Cela peut parfois échouer car la liste d'arguments peut devenir plus grande (en octets) que le maximum autorisé par le shell (getconf ARG_MAX). Cela peut être résolu par xargs avec l'option -L.

considérez cet exemple:

$ 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

Il n'est donc pas nécessaire d'installer de logiciel supplémentaire, tout ce dont vous avez besoin est dans gnu-findutils:

find /path -mtime +30 -print0 | xargs -0 -L 5000 rm 
Ярослав Рахматуллин
la source
certains d00d ont pensé qu'il serait utile d'ajouter -print0 et -0 pour trouver et xargs. Ces arguments forcent leurs commandes à utiliser le caractère nul (\ 0) au lieu d'une nouvelle ligne (\ n) pour séparer les arguments. Cela est utile lorsque le nom de fichier contient des espaces ou des nouvelles lignes.
Ярослав Рахматуллин
(1) Vous n'avez pas besoin de dire \+; simple +est assez bon. (2) Cela ne "échouera pas parce que la liste d'arguments peut s'allonger ...".  find  … -exec … {} +fera la même chose qui xargsfera; il exécutera la commande autant de fois que nécessaire. Par exemple (comme dans votre exemple), si vous avez entre 15001 et 20000 fichiers, findexécutez le -execprogramme 'd ( rm) quatre fois.
G-Man dit `` Réintègre Monica '' le