J'ai un certain nombre de fichiers journaux sous la forme :
log.2014-02-19-10_24_22
C'est à dire. log.AAAA-MM-JJ-H24_MI_SS
La date qui fait partie du nom du fichier journal correspond à la date à laquelle le fichier journal a été créé pour la première fois. Ainsi, à tout moment, je peux avoir les fichiers journaux suivants dans mon répertoire :
log.2014-02-19-10_18_54
log.2014-02-19-10_21_20
log.2014-02-19-10_23_11
etc.
J'ai maintenant un script qui est invoqué par un cronjob et qui supprime les "anciens" fichiers journaux :
$ cat delete-old-rotated-logs
#!/usr/bin/env bash
find /home/foo -maxdepth 1 -iname log* -type f -mmin +1800 -exec rm {} ;
Le problème auquel je suis confronté est que parfois le processus qui se connecte s'est écrasé, de sorte que le "dernier" fichier journal devient également "ancien" après un certain temps (puisqu'aucun processus n'écrit dessus) et est supprimé, ce qui me fait perdre la trace. Comment puis-je réécrire le delete-old-rotated-logs
script pour qu'il supprime les anciens fichiers sauf le dernier (ou le dernier N
) ? Pour la commande, on peut utiliser à la fois le nom du fichier lui-même ou l'horodatage de modification (plus robuste).
Réponse acceptée :
find /home/foo -maxdepth 1 -iname log* -type f -mmin +1800 |
sort | head -n -1 | xargs rm
Ou si vous voulez utiliser mtime
au lieu du nom de fichier :
find /home/foo -maxdepth 1 -iname log* -type f -mmin +1800 -exec ls -t {} + |
tail -n +2 | xargs rm
D'après les commentaires de @Stephane, une approche plus robuste serait de faire :
IFS=$'n'
set -f
rm $(
find /home/foo -maxdepth 1 -iname log* ! -name $'*n*' -type f -mmin +1800 |
sort | head -n -1 )
Ou pour le shell POSIX (nécessite toujours les outils GNU) :
IFS='
'
ex_newline='*
*'
set -f
rm $(
find /home/foo -maxdepth 1 -iname log* ! -name "$ex_newline" -type f -mmin +1800 |
sort | head -n -1 )
Un seul pipeline (robuste) peut être utilisé avec une version récente de GNU sed
/sort
(et GNU find comme pour tout ce qui précède):
find /home/foo -maxdepth 1 -iname log* -type f -mmin +1800 -print0 |
sort -z | sed -z '$d' | xargs -0 rm