66 votes

Comment supprimer tous les fichiers sauf les 10 plus récents sous Linux ?

J'essaie de garder un répertoire plein de fichiers journaux gérable. Chaque nuit, je veux supprimer tous les fichiers sauf les 10 plus récents. Comment puis-je faire cela en une seule commande ?

0voto

BiS Points 101

Basé sur la réponse d'Isaac Freeman, mais fonctionnant sur n'importe quel répertoire :

ls -1tr $PATH_TO_DELETE/* | head -n -10 | xargs -d '\n' rm -f --

Vous pouvez également définir un préfixe, comme $PATH_TO_DELETE/testFi*

Si vous utilisez * après le PATH ls affichera les noms de fichiers absolus, du moins dans "mon" bash :)

0voto

Stefan Points 1

Sur mon NAS Synology, j'ai légèrement modifié La réponse de @h0tw1r3 pour le faire fonctionner dans une tâche planifiée et pour gérer les éventuels caractères blancs et/ou de nouvelle ligne dans le nom du fichier en terminant par zéro les chaînes générées :

find /path/to/backup/folder -maxdepth 1 -type f -printf '%Ts\t' -print0 \
| sort -rnz \
| tail -n +11 -z \
| cut -f2- -z \
| xargs -0 -r rm -f

IMPORTANT : Cela supprimera tous les fichiers correspondants ! Je recommande vivement de faire un essai préalable en remplaçant la dernière commande xargs -0 -r rm -f con xargs -0 qui fera écho aux fichiers correspondants au lieu de les supprimer.

Une brève explication de chaque étape :

  1. find /path/to/backup/folder -maxdepth 1 -type f -printf '%Ts\t' -print0

    Trouvez tous les fichiers réguliers ( -type f ) dans le dossier de sauvegarde sans traverser les sous-dossiers ( -maxdepth 1 ), imprimer ( -printf ) le Temps Unix ( %Ts ) de la dernière modification suivie d'un caractère de tabulation ( \t utilisé à l'étape 4) et le nom complet du fichier suivi d'un caractère nul ( -print0 ).

  2. sort -rnz

    Trier les éléments à terminaison nulle ( -z ) de l'étape précédente en utilisant une comparaison numérique ( -n ) et inverser l'ordre ( -r ). Le résultat est une liste de toutes les sauvegardes triées par leur date de dernière modification dans l'ordre décroissant.

  3. tail -n +11 -z

    Imprimer les dernières lignes ( tail ) de l'étape précédente à partir de la ligne 11 ( -n +11 ) en considérant que chaque ligne est terminée par zéro ( -z ). Cela exclut les 10 fichiers les plus récents (par date de modification) des étapes restantes.

  4. cut -f2- -z

    Coupez chaque ligne depuis le deuxième champ jusqu'à la fin ( -f2- ) en traitant chaque ligne comme étant à terminaison zéro ( -z ) pour obtenir une liste contenant le chemin complet de chaque sauvegarde de plus de 10 jours.

  5. xargs -r -0 rm -f

    Prenez la terminaison zéro ( -0 ) de l'étape précédente ( xargs ), et, s'il y en a ( -r évite d'exécuter la commande passée à xargs s'il n'y a pas de caractères non-blancs), force la suppression ( rm -f ) les.

-1voto

Mayur Gite Points 9

Vous pouvez supprimer les fichiers dont le nom est spécifique et qui datent de plusieurs jours en utilisant la fonction

find /Users/test/delete/*.zip -mtime +10 -exec rm {} \;

La commande ci-dessus supprime les fichiers correspondant au modèle /Users/test/delete/*.zip et qui sont plus vieux de 10 jours.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X