web-dev-qa-db-fra.com

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

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?

36

type option de filtrage des résultats

find accepte l'option type pour sélectionner, par exemple, uniquement des fichiers.

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

Laissez -delete pour indiquer 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 d pour l'inverse, en répertoriant uniquement les répertoires correspondant à vos arguments.


Options additionelles

Vous voudrez peut-être lire man find, car vous aurez peut-être besoin de plus d'options à l'avenir. Par exemple, -maxdepth vous permettrait de limiter les éléments trouvés à une profondeur spécifique, par exemple. -maxdepth 0 ne recurse pas dans les sous-répertoires.

Quelques remarques

  • Je me demande comment la commande aurait supprimé un dossier, puisque vous ne pouvez pas supprimer un dossier avec rm uniquement. Vous aurez besoin de rm -r pour cela.

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

  • Mettez le {} entre guillemets, 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 avec une barre oblique inverse.

50
slhck

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

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

L'utilisation de -delete est plus rapide (pas de fork() et execve() supplémentaires pour chaque fichier), mais cela présente des risques, car -delete fonctionne également comme condition. Par conséquent:

# 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 que find et rm accélèrent le traitement de tonnes de fichiers, consultez l'idiome UNIX find ... | xargs ... rm.

5
Michał Šrajer

Vous pouvez facilement le faire avec la commande find

$ find -type f

Ce qui limite les résultats au type de fichier

1
Bernhard

J'avais du mal à bien comprendre les choses à l'aide des scripts fournis ci-dessus et de certains autres scripts, en particulier lorsque les noms de fichiers et de dossiers contenaient des lignes ou des espaces.

Finalement, nous sommes 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

Lien de la source originale

Possède 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 d'un certain motif lors de la suppression

1
user52573

Pour accélérer la commande, utilisez '+' au lieu de \;

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

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

0
olibre

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 modifiés avant 5 jours.

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

0
Nikhil Shinde