Forum Programmation.shell Script de purge de log

Posté par  .
Étiquettes : aucune
0
8
nov.
2005
Bonjour,

j'envisage de réaliser un script me permettant de purger un répertoire contenant des logs de mes scripts.

Ces logs ont pour noms:
[nom_du_script].log
et sont archivés chaque jour sous:
[nom_du_script]_YYYYMMDD.log

Je souhaites soit garder les n derniers logs (cas pour les scripts qui ne tournent pas chaques jours), soit les logs des n derniers jours.

je suis parti sur la commande suivante pour trouver les n derniers logs archivés:
ls -r --sort=time [nom_du_script]_* | tail -n [nombre_a_conserver]

Mais après je sèche pour effacer les plus anciens...
En déplacant ceux-ci et supprimant tous les autres?

Y-a-t-il une solution plus simple/propre? Une commande particulière qui serait plus pratique ici?

Merci
(je cherche plus des pistes de réflexion qu'une soluce "toute faite", bien que n'étant pas contre non plus ;) )
  • # Bein

    Posté par  . Évalué à 5.

    en solution toute faite tu as logrotate qui fait tout ça et bien plus encore.
  • # head -n -N

    Posté par  . Évalué à 3.

    Sur la base de la commande que tu as déjà, tu pourrais utiliser "head" avec une valeur négative pour lister "tous sauf les N derniers" :
    ls -r --sort=time [nom_du_script]_* | head -n -[nombre_a_conserver]


    Et puis sinon, bah [+] pour logrotate, qui rend vraiment de très fiers services.
  • # Sinon, à la main

    Posté par  . Évalué à 2.

    Ca te conviendrait ça:


    #!/bin/sh
    KEEP=3
    LIST=$(ls -r --sort=time cequetuveux*)
    COUNT=$(echo $LIST|wc -l)
    echo "rm $(echo $LIST|head -n $((COUNT-KEEP))|tr '\n' ' ' )"
    echo "keep $(echo $LIST|tail -n $KEEP|tr '\n' ' ' )"


    Résultat:
    rm h g f e d c
    keep b a

    _ Tu met dans KEEP le nombre de fichiers que tu veux garder+1 (bizarrement d'ailleurs, je sais pas trop pourquoi tail a ce comportement dans le cas présent mais pas le temps de chercher).

    _ $(( )) te permet de faire de l'arithmétique en shell.

    _ tr te permet de virer les retours chariots et de les remplacer par des espaces pour que rm n'emmerde pas le monde :)
    • [^] # Re: Sinon, à la main

      Posté par  . Évalué à 1.

      Je reviens sur ton script:

      je rajoute un -1 dans le ls sans quoi il me met tout a la ligne (et le wc -l patauge par ex...)
      LIST=$(ls -1 -r --sort=time cequetuveux*)

      Le tail fonctionne normalement pour moi, pas besoin de faire +1 a la variable KEEP.

      Pour info, je suis sous RedHat AS3 et ksh.

      Merci encore!
  • # find

    Posté par  . Évalué à 1.

    Mis à part l'utilisation de logrotate comme conseillé ci dessus, tu dois pouvoir utiliser find pour faire ça :
    tu as un fichier log par jour, tu veux garder les n derniers :

    find /rep/ -name 'nom_du_script*.log' -a -mtime +n -exec rm {} \;

    (Pour tester, remplace rm {} par rm -i {} si tu veux)

    Cela effacera les fichiers dont le nom correspond à nom_du_script*.log et dont la date de modification est supérieure à n jours (donc il te restera les n derniers :) ).
  • # Merci

    Posté par  . Évalué à 1.

    Merci beaucoup à tous, avec tout ça, je dois pouvoir me debrouiller pour mon script.

    Je ne connaissais pas les commandes logrotate et head. Une bonne occasion de les découvrir!

    Et merci pour le script proposé aussi. Je dois pouvoir me baser dessus effectivement!

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.