GNU/Linux >> Tutoriels Linux >  >> Linux

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

type option de filtrage des résultats

find accepte le type option pour sélectionner, par exemple, uniquement les fichiers.

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

Omettre -delete pour montrer ce qu'il supprimerait, et une fois que vous avez vérifié cela, continuez et exécutez la commande complète.

Cela ne fonctionnerait que sur des fichiers, pas sur des répertoires. Utilisez -type d à l'inverse, lister uniquement les répertoires qui correspondent à vos arguments.

Options supplémentaires

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

Quelques remarques

  • Je me demande comment la commande aurait supprimé un dossier, car vous ne pouvez pas supprimer un dossier avec rm seulement. Vous auriez besoin de rm -r pour ça.

  • Aussi, /path/to/files* prête à confusion. Vouliez-vous dire /path/to/files/ ou vous attendez-vous à ce que le caractère générique s'étende à plusieurs noms de fichiers et de dossiers ?

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


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

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

Utilisation de -delete est plus rapide (pas de fork() supplémentaire et execve() pour chaque fichier), mais c'est risqué car -delete fonctionne aussi comme condition, donc :

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

mais si vous échangez UNIQUEMENT les arguments :

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

Si jamais vous avez besoin de find et rm pour travailler plus rapidement sur des tonnes de fichiers, consultez le find ... | xargs ... rm Expression UNIX.


Linux
  1. Comment supprimer tous les fichiers antérieurs à X nombre de jours sous Linux ?

  2. Pourquoi Find -mtime +1 ne renvoie-t-il que les fichiers de plus de 2 jours ?

  3. Supprimer tous les fichiers sauf dans un certain sous-répertoire avec Find ?

  4. Comment rechercher et supprimer des fichiers antérieurs à une période donnée sous Linux

  5. calculer l'espace disque total utilisé par les fichiers de plus de 180 jours à l'aide de la recherche

Comment supprimer des fichiers plus anciens que les jours spécifiés sous Linux

Comment supprimer les fichiers de plus de n jours SANS utiliser la commande find

rechercher et supprimer un fichier ou un dossier de plus de x jours

Comment supprimez-vous les fichiers antérieurs à une date spécifique sous Linux ?

Quel est le problème avec mon script bash pour conserver les x derniers fichiers et supprimer le reste ?

Tâche cron pour supprimer tous les fichiers de plus de 7 jours avec une extension dans un dossier spécifique - ne fonctionne pas