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 ?

74voto

Isaac Freeman Points 1065

Pour une solution portable et fiable, essayez ceci :

ls -1tr | head -n -10 | xargs -d '\n' rm -f --

En tail -n -10 dans l'une des autres réponses ne semble pas fonctionner partout (c'est-à-dire pas sur mes systèmes RHEL5).

Et en utilisant $() o `` sur la ligne de commande de rm risque de

  1. en séparant les noms de fichiers par des espaces, et
  2. dépassant la limite maximale de caractères de la ligne de commande.

xargs résout ces deux problèmes parce qu'il détermine automatiquement le nombre d'arguments qu'il peut transmettre dans la limite des caractères, et avec l'attribut -d '\n' il ne sera divisé qu'à la limite de la ligne d'entrée. Techniquement, cela peut encore poser des problèmes pour les noms de fichiers contenant une nouvelle ligne, mais c'est beaucoup moins fréquent que les noms de fichiers contenant des espaces, et la seule façon de contourner les nouvelles lignes serait beaucoup plus compliquée, impliquant probablement au moins awk, voire perl.

Si vous n'avez pas xargs (vieux systèmes AIX, peut-être ?), vous pouvez en faire une boucle :

ls -1tr | head -n -10 | while IFS= read -r f; do
  rm -f "$f"
done

Ce sera un peu plus lent parce que cela génère un fichier séparé de rm pour chaque fichier, mais évitera les avertissements 1 et 2 ci-dessus (mais souffre toujours des nouvelles lignes dans les noms de fichiers).

22voto

eje211 Points 813

Le code à inclure dans votre script est le suivant

 rm -f $(ls -1t /path/to/your/logs/ | tail -n +11)

En -1 (un numérique) imprime chaque fichier sur une seule ligne, par sécurité. L'option -f option pour rm lui indique d'ignorer les fichiers inexistants lorsque ls ne renvoie rien.

21voto

stimpy77 Points 2791

Apparemment, l'analyse syntaxique ls c'est le mal .

Si chaque fichier est créé quotidiennement et que vous souhaitez conserver les fichiers créés au cours des 10 derniers jours, vous pouvez le faire :

find /path/to/files -mtime 10 -delete

Ou si chaque fichier est créé de manière arbitraire :

find /path/to/files -maxdepth 1 -type f -printf '%Ts\t%P\n' | sort -n | head -n -10 | cut -f 2- | xargs rm -rf

10voto

DisgruntledGoat Points 21368

Un outil comme logrotate le fait pour vous. Il rend la gestion des journaux beaucoup plus facile. Vous pouvez également inclure des routines de nettoyage supplémentaires, comme Halo l'a suggéré.

2voto

user74261 Points 133

J'ai modifié L'approche d'Isaac un peu.

Il fonctionne maintenant avec un chemin souhaité :

ls -d -1tr /path/to/folder/* | head -n -10 | xargs -d '\n' rm -f

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