Comment supprimer tous les fichiers de plus de 3 jours lorsque «Liste d'arguments trop longue»?

89

J'ai un répertoire de fichiers journaux qui contient 82000 fichiers et répertoires (environ la moitié et la moitié).

J'ai besoin de supprimer tous les fichiers et répertoires de plus de 3 jours.

Dans un répertoire contenant 37000 fichiers, j'ai pu le faire avec:

find * -mtime +3 -exec rm {} \;

Mais avec 82000 fichiers / répertoires, j'obtiens l'erreur:

/ usr / bin / find: Liste d'arguments trop longue

Comment contourner cette erreur afin de pouvoir supprimer tous les fichiers / répertoires de plus de 3 jours?

Edward Tanguay
la source
1
Avez-vous essayé find -mtime +3 -exec rm {} +?
Gilles Quenot
1
Je pense que courir find * -mtime +3 |xargs rmrésoudrait ce problème.
Mats Petersson
9
Je pense que le seul problème est find *. find .est mieux. Le shell globing avec étend le *à une énorme liste de fichiers et répertoires.
bruit sans art le
@artlessnoise est parfait.
sjas

Réponses:

120

Pour supprimer tous les fichiers et répertoires du répertoire actuel :

find . -mtime +3 | xargs rm -Rf

Ou bien, plus conforme à la commande d'origine de l'OP:

find . -mtime +3 -exec rm -Rf -- {} \;
hd1
la source
26
-1 Le problème est l'étoile dans "find *", vous l'avez résolu en utilisant "find". au lieu. Xargs est ici trompeur.
Aleksandr Levchuk
7
@AleksandrLevchuk il résout le problème des OP, et ne mérite donc pas un
hd1
11
Question: "find * -mtime +3 -exec rm {} \;" donne une liste d'arguments trop longue. Réponse: Utilisez "find. -Mtime +3 -exec rm {} \;"
Aleksandr Levchuk
2
Vous voudrez peut-être ajouter --après rm, commefind . -mtime +3 -exec rm -- {} \;
domen
8
Personne n'a dit à quoi ça --sert.
Acumenus
59

Peut également utiliser:

find . -mindepth 1 -mtime +3 -delete

Pour ne pas supprimer le répertoire cible

Vangheem
la source
4
Meilleure réponse, beaucoup plus propre que d'appeler rm (et probablement plus sûre). Fonctionne également pour les sous-répertoires.
base6
16

Une autre solution pour la question originale, esp. utile si vous souhaitez supprimer uniquement CERTAINS des fichiers les plus anciens d'un dossier, ce serait comme ceci:

find . -name "*.sess" -mtime +100 

et ainsi de suite .. Les citations bloquent les caractères génériques du shell, vous permettant ainsi de "trouver" des millions de fichiers :)

62mkv
la source