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?
linux
ubuntu
command-line
find
Kristian
la source
la source
cache*
s'étend à de nombreux fichiers, vous pouvez essayer quelque chose comme à lafind . -name 'cache*' -mtime +30 -exec rm {} \;
place.Réponses:
J'aime utiliser
tmpwatch
pour ces choses, c'est la dernière fois que le fichier a été modifié. C'est simple et fonctionne bien dans de nombreux cas:Pour Ubuntu, cochez
tmpreaper
plutôt.Si vous souhaitez vérifier la dernière fois que le fichier a été accédé, vous utilisez ce qui suit:
Vous ne pouvez pas utiliser tmpwatch -a sur des systèmes de fichiers montés avec noatime. vous pouvez toujours utiliser -m
la source
Ubuntu 10.04.2 LTS
et cette commande n'existe pas ..tmpreaper
plutôt.Vous pouvez éviter la création d'un nouveau processus pour chaque fichier en utilisant
la source
Essayez d'exécuter ce qui précède avec nice:
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.
la source
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
tmpwatch
est 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:
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:
Il n'est donc pas nécessaire d'installer de logiciel supplémentaire, tout ce dont vous avez besoin est dans gnu-findutils:
la source
\+
; 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 quixargs
fera; 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,find
exécutez le-exec
programme 'd (rm
) quatre fois.