GNU/Linux >> Tutoriels Linux >  >> Linux

Supprimer les anciens fichiers journaux à l'exception du dernier (trié par ordre alphanumérique) ?

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

Linux
  1. 3 façons de supprimer tous les fichiers d'un répertoire sauf un ou quelques fichiers avec des extensions

  2. Sed :Supprimer toutes les occurrences d'une chaîne, sauf la première ?

  3. Remplacer toutes les nouvelles lignes par un espace sauf la dernière ?

  4. Déplacer tous les fichiers sauf un

  5. Supprimez tous les fichiers sauf les 3 plus récents dans le script bash

3 méthodes pour afficher la sortie tail -f de plusieurs fichiers journaux dans un terminal

Comment supprimer plusieurs fichiers à la fois dans Bash sous Linux ?

Déconnecter un utilisateur et supprimer le compte

Supprimer tout /var/log ?

Supprimer des fichiers avec logrotate

Grep dans un énorme fichier journal (> 14 Go) uniquement les derniers x Go ?