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 ?
Réponses
Trop de publicités?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
- en séparant les noms de fichiers par des espaces, et
- 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).
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
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
- Réponses précédentes
- Plus de réponses