Supprimer les fichiers de plus de X jours +

143

J'ai trouvé la commande pour supprimer des fichiers de plus de 5 jours dans un dossier

find /path/to/files* -mtime +5 -exec rm {} \;

Mais comment puis-je aussi le faire pour les sous-répertoires de ce dossier?

Teddy291
la source
Voulez-vous dire des fichiers dans les sous-répertoires? ou les sous-répertoires eux-mêmes?
Rahul
3
find /path/to -type d -empty -delete
Costas
2
Supprimez les fichiers dans les sous-répertoires
datant
3
Peut-être amusant quand j'ai des fichiers avec des espaces. Par exemple, un fichier appelé "test one" et rm est alimenté rm test one. (Ce qui supprimera un fichier appelé "test" et un fichier appelé "un", mais pas un fichier appelé "test un"). Astuce: -delete ou -print0
Hennes
6
En guise de remarque, citez toujours l'argument fourni parfind pour éviter les problèmes de caractères spéciaux, comme indiqué à la première ligne de la réponse. Exemple:find /path/to/files/ -exec somecommand '{}' \;
Walf

Réponses:

240

Soyez prudent avec les noms de fichiers spéciaux (espaces, guillemets) lorsque vous effectuez un transfert vers rm.

Il existe une alternative sûre - l' option -delete :

find /path/to/directory/ -mindepth 1 -mtime +5 -delete

C'est ça, pas d'appel séparé et vous n'avez pas à vous soucier des noms de fichiers.

Remplacez -deletepar -depth -printpour tester cette commande avant de l'exécuter ( -deleteimplique -depth).

basic6
la source
23
Permet également -type fde supprimer des fichiers uniquement (et de conserver les sous-répertoires)
Oleg
3
Alternativement, si vous voulez faire la même chose pour tous les fichiers plus récents que cinq jours: trouver / chemin / vers / répertoire / -mindepth 1 -mtime -5 -delete
zmonteca
Si mon chemin contient des espaces, comment dois-je le faire? find /path/to/dir\ with\ spaces/ -mindepth 1 -mtime +5 -delete?
Patrick Gregorio,
3
@ uom-pgregorio Je suggère de mettre le chemin entre guillemets.
arrive
4
Notez que chaque findargument est un filtre qui utilise le résultat du filtre précédent en entrée. Donc, assurez-vous d’ajouter le -delete comme dernier argument. IE: find . -delete -mtime +5effacera TOUT dans le chemin actuel.
Johan
15

Notez que cette commande ne fonctionnera pas si elle trouve trop de fichiers. Cela produira une erreur comme:

bash: /usr/bin/find: Argument list too long

Cela signifie que la limite de l'appel système exec sur la longueur d'une ligne de commande a été dépassée. Au lieu d'exécuter rm de cette façon, il est beaucoup plus efficace d'utiliser xargs . Voici un exemple qui fonctionne:

find /root/Maildir/ -mindepth 1 -type f -mtime +14 | xargs rm

Cela supprimera tous les fichiers (type f) modifiés il y a plus de 14 jours sous / root / Maildir / à partir de là et plus profondément (mindepth 1). Voir le manuel de recherche pour plus d'options .

Julius
la source
7
Pour la réponse de @ AfshinHamedi sur AskUbuntu ( askubuntu.com/questions/589210/removing-files-older-than-7-day ), faites attention aux fichiers contenant des nouvelles lignes et des caractères spéciaux. Au lieu d'utiliserfind /root/Maildir/ -mindepth 1 -type f -mtime +14 -print0 | xargs -r0 rm --
Cbhihe
2
Ou ajoutez simplement '+' aux résultats de la recherche
Dani_l
8

C'est le même. Vous devez simplement fournir le répertoire parent plutôt que le préfixe des fichiers. Dans votre exemple, ce serait:

find /path/to -type f -mtime +5 -exec rm {} \;

Cela supprimera tous les fichiers de moins de 5 jours qui se trouvent dans /path/toet ses sous-répertoires.

Pour supprimer les sous-répertoires vides, reportez-vous au commentaire @Costas ci-dessus.

apaul
la source
4
Notez que pour chaque fichier, vous exécuterez la commande rm. Si vous avez 1000 fichiers de plus de 5 jours, alors rm sera démarré 1000 fois. Pour cette raison, considérons l'option -delete de la même manière que dans le commentaire ou l'exercise de Costa {} \ +
Hennes le
@Hennes: - 1) je ne suis pas sûr que vous ayez besoin de vous échapper +dans ce cas. - 2) mieux écrire -exec rm '{}' +pour combattre le mal des fichiers avec des caractères spéciaux (espaces, nouvelles lignes, etc.) dans leur nom.
Cbhihe
-1
find . -mtime +3 -type f -not -name '*pid*' |xargs rm -rf
Susil
la source