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?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 :)
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 :
-
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
). -
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. -
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. -
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. -
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.
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.
- Réponses précédentes
- Plus de réponses