Script Bash pour supprimer les fichiers de plus de x jours avec des sous-répertoires

37

J'essaie de supprimer une tonne de fichiers de plus de x jours.

Maintenant, j'ai un script pour le faire

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

Mais cela supprimera également les sous-répertoires. Il y a une tonne de dossiers, mais j'aimerais les conserver et supprimer les fichiers de plus de 10 jours contenus dans ces dossiers.

Y a-t-il un moyen de faire cela?

JoyIan Yee-Hernandez
la source

Réponses:

50

type option de filtrage des résultats

findaccepte l' typeoption permettant de sélectionner, par exemple, uniquement les fichiers.

find /path/to/files -type f -mtime +10 -delete

Laissez de côté -deletepour montrer ce que cela supprimerait, et une fois que vous aurez vérifié, allez-y et exécutez la commande complète.

Cela ne fonctionnerait que sur des fichiers, pas des répertoires. Utilisez -type dpour l'inverse, seulement la liste des répertoires qui correspondent à vos arguments.


Options additionelles

Vous voudrez peut-être lire man find, car il y a d'autres options dont vous pourriez avoir besoin à l'avenir. Par exemple, -maxdepthvous permettrait de restreindre uniquement les éléments trouvés à une profondeur spécifique, par exemple, -maxdepth 0ne pas renvoyer dans des sous-répertoires.

Quelques remarques

  • Je me demande comment la commande aurait supprimé un dossier, puisque vous ne pouvez pas supprimer un dossier avec rmseulement. Vous aurez besoin rm -rde ça.

  • Aussi, /path/to/files*est déroutant. Voulez-vous dire /path/to/files/ou attendez-vous que le caractère générique soit étendu à plusieurs noms de fichiers et de dossiers?

  • Mettez les {}guillemets simples, c'est- '{}'à- dire pour éviter que le nom de fichier / répertoire substitué soit interprété par le shell, tout comme nous protégeons le point-virgule par une barre oblique inverse.

slhck
la source
Eh bien, il y a beaucoup de dossiers dans / chemin / vers / fichiers / en fait, je voudrais exécuter le mtime +10 -exec rm dans chacun de ces dossiers, mais conserver les dossiers eux-mêmes. En gros, je voudrais obtenir fichiers de plus de 10 jours et conserver tous les dossiers. Je suis un newb désolé pour ce newbness :)
JoyIan Yee-Hernandez
Eh bien, voilà :) Il suffit de faire un find /path/to/files* -type f -mtime +10et de voir ce qu’il produirait.
Slhck
Oui, en cas de doute, ne faites pas la -exec, voyez ce qu'il trouve en premier.
Rob
2
@ JoyIanYee-Hernandez Vous pouvez également utiliser l' -deleteargument to find, qui supprime tous les fichiers et dossiers, ce dernier uniquement s'il est vide. Cela implique -depth, c'est-à-dire une recherche en profondeur d'abord.
Daniel Beck
1
@Kreker Ensuite, vous devez ajouter -mindepth 1pour exclure le répertoire parent.
Slhck
5

Comme dans les réponses précédentes (+1 pour les deux), l'astuce consiste à utiliser un -type fprédicat.

Notez qu'au lieu de cela, -exec rm '{}'vous pouvez également utiliser le -deleteprédicat. Mais ne fais pas ça. Avec -exec rm '{}'vous, vous pouvez (et devriez) d’abord -exec echo rm '{}'vérifier que c’est vraiment ce que vous voulez. Après cela, relancez la commande sans le echo.

L'utilisation -deleteest plus rapide (pas de fichier supplémentaire fork()et execve()pour chaque fichier), mais cela est risqué car cela -deletefonctionne aussi comme condition, donc:

# delete *.tmp files
find . -type f -name '*.tmp' -delete

mais si vous échangez SEULEMENT les arguments:

# delete ALL files
find . -type f -name '*.tmp' -delete

Si vous avez besoin de travailler avec des tonnes de fichiers plus rapidement findet rmplus rapidement, consultez l' find ... | xargs ... rmidiome UNIX.

Michał Šrajer
la source
4
Je pense que vos deux derniers exemples sont exactement les mêmes, vous voudrez peut-être corriger cela!
Slhck
1

Vous pouvez facilement le faire avec la commande find

$ find -type f

Ce qui limite les résultats au type de fichier

Bernhard
la source
1

J'avais du mal à comprendre cela en utilisant les scripts fournis ci-dessus et d'autres scripts, en particulier lorsque les noms de fichiers et de dossiers contenaient des lignes ou des espaces.

Nous sommes finalement tombés sur tmpreaper et cela a assez bien fonctionné pour nous jusqu’à présent.

tmpreaper -t 5d ~/Downloads


tmpreaper  --protect '*.c' -t 5h ~/my_prg

Source originale lien

A des fonctionnalités telles que test, qui vérifie les répertoires de manière récursive et les répertorie. Possibilité de supprimer des liens symboliques, des fichiers ou des répertoires ainsi que le mode de protection pour un certain motif lors de la suppression

utilisateur52573
la source
0

Pour accélérer la commande, utilisez '+'plutôt que\;

find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'

Cela ne fonctionnera rmqu'une fois à la fin au lieu de chaque fois qu'un fichier est trouvé.
( rmpeut être exécuté plusieurs fois si vous avez vraiment beaucoup de fichiers à cause de la limitation de la longueur de la ligne de commande, mais cela reste presque aussi rapide que d'utiliser -delete)

olibre
la source
0

rm -f find /path/to/files -type file -mtime -5

Cela supprimera les fichiers modifiés dans les 5 jours.

rm -f find /path/to/files -type file -mtime +5

Ceci effacera les fichiers qui ont été modifiés avant 5 jours.

Utilisez `avant find et à la fin après 5.

Nikhil Shinde
la source