IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Script de purge sous linux


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Par défaut Script de purge sous linux
    Bonjour,

    Explication du contexte...
    J'ai des switchs CISCO qui envoient leur configuration sur un serveur tftp automatiquement a chaque modification de celle ci sur l'equipement.
    L'objectif est de garder seulement 5 sauvegardes, soit les 5 plus recentes.
    La forme du nom des fichiers est:
    switch01-421--Mar--1-1993-01-03-34.974-GMT-0
    Où "switch01" correspond au nom de l'equipement; "421" represente l'usine où est l'equipement (qui pourrait etre supprimé); ensuite la date, et tout a la fin un numero d'increment (le numero d'increment repart a "0" a chaque reboot de l'equipement.
    Sur le serveur tftp, j'ai un repertoire par usine... soit une arboressence:
    serveur-tftp/421
    /533
    /679

    Note importante, il peut y avoir 50 sauvegardes du meme equipement en une journée comme une seule par an...
    L'idée serait de programmer un tache cron tous les jours, qu'elle scanne le repertoire "serveur-tftp" (recursivement) et que dans chaque repertoire elle garde seulement les 5 dernieres sauvagerdes de chaque equipement...

    alors ca fait un moment que j'ait pas fait de bash ou autre script... donc je viens vers vous pour savoir comment faire cette fameuse boucle, et le decoupage de nom de fichiers (ou utilisation de la date de creation de fichier) pour pouvoir selectionner les fichiers a garder ou effacer...

    PS : j'espere etre dans la bonne categorie pour poster...


    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Peut-on compter sur la date de dernière modification des fichiers?
    C'est-à-dire, est-on sûr qu'ils ne sont jamais modifiés après leur création?

  3. #3
    Membre du Club
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Par défaut
    Oui, les fichiers ne seront jamais modifiés

  4. #4
    Invité
    Invité(e)
    Par défaut
    A tester chez toi (le echo est à remplacer par le rm) mais ça serait une solution s'il n'y a pas d'espace dans le nom de tes fichiers.

    Le "ls -t" retourne les fichiers classés par date de création (le plus récent en 1er : ordre de création dans mon test: azerty) et on stocke ça dans une liste. Il suffit alors d'ignorer les 5 premiers et de supprimer les autres.

    Mais il y a peut être mieux à faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    $ ls switch01-421*
    switch01-421-a  switch01-421-r  switch01-421-u  switch01-421-z
    switch01-421-e  switch01-421-t  switch01-421-y
     
    $ liste=`ls -t switch01-421*`
     
    $ i=1
     
    $ for fichier in $liste
    > do
    >   if [ $i -gt 5 ]
    >   then
    >     #rm $fichier
    >     echo $fichier
    >   fi
    >   ((i++))
    > done
    switch01-421-z
    switch01-421-a

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 362
    Par défaut
    Bonjour,

    Une autre méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in *
    do 
       [ -d $i ] && find ./$i -type f -printf '%C@/%p\n' | sort -n | head -n -5 | cut -d\/ -f2- | xargs echo
    done
    De même, il suffit de remplacer le
    echo
    par
    rm -f
    Cordialement.

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 665
    Par défaut
    Bonjour,

    for d in */, ainsi le test -d devient inutile.


    un spécification a été ajoutée sur le forum d'un autre site sur lequel shake.norris a également posté :
    Et il faut aussi que je prene le debut du nom de fichier en compte, car il y a plusieurs switch sauvegardés dans un seul répertoire...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Ah voilà un truc que je cherchais mais j'avais oublié le -n dans le head.
    Du coup j'ai peut être plus simple à comprendre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    equipement=switch01
    usine=421
    liste=`ls -rt $equipement-$usine* | head -n -5`
     
    if [ ${#liste} -gt 0 ]
    then
     echo $liste
     #rm $liste
    fi
    Il reste à le faire dans tout les répertoires avec les bons nom d'équipement et d'usine. A toi de nous dire si tu les connais d'avance ou non

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 665
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #!/bin/bash
    shopt -s nullglob
    for d in server-tftp/*/
    do
       for f in $d*
       do
          ff="${f##$d}"
          ff="${ff%%-*}"
          if test -n $files
          then
             lfiles="${files[@]: -1}"
             if [[ $lfiles == *$ff* ]]
             then
                files+=( "$f" )
             else
                test ${#files[@]} -gt 5 && printf 'rm %s\n' "${files[@]::${#files[@]}-5}"
    #            test ${#files[@]} -gt 5 && rm "${files[@]::${#files[@]}-5}"
                files=( "$f" )
             fi
          else
             files+=( "$f" )
          fi
       done
    #
    echo "==="
    done
    test ${#files[@]} -gt 5 && printf 'rm %s\n' "${files[@]::${#files[@]}-5}"
    ...
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 362
    Par défaut
    Je ne comprends pas tout, comme où se situe le test sur l'ancienneté du fichier ?

    @Beginner.j , si tu passes par un "rm -f" au lieu d'un "rm" tout court, le test sur la liste vide est inutile.

    Cordialement.

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 665
    Par défaut
    Citation Envoyé par disedorgue
    où se situe le test sur l'ancienneté du fichier ?
    bash trie les fichiers lexicalement (par ordre alphabétique). ici, le format des dates, qui apparaissent dans les noms des fichiers, permet au shell de trier les fichiers correctement.

    Edit:
    dans «switch01-421--Mar--1-1993-01-03-34.974-GMT-0», par exemple, il faut que la partie en gras ne change pas.
    mais shake.norris n'en parle pas
    je fais donc comme si elle ne change pas.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 362
    Par défaut
    Sauf si le format initial du nommage de fichier à changé, il est de ce type:
    switch01-421--Mar--1-1993-01-03-34.974-GMT-0 et la partie en rouge fausse le coté lexical.

    Je pense que le MAR--1 fait partie de la date ( 1er mars ==> 01-03 si c'est du format anglais)

    Cordialement.

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 665
    Par défaut
    je suis d'accord.
    j'ai édité entre temps mon message.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 362
    Par défaut
    Idem.

  14. #14
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 665
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ LC_TIME=C date +%F -date -1day
    2013-02-01
    bah? AAAA-MM-JJ !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 362
    Par défaut
    Bonjour,

    Une version qui tient compte des nouvelles specifications:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i in $(echo server-tftp/*/* | sed -e 's/\([[:alnum:]/]*-[0-9]*\)[[:graph:]]*\( \|$\)/\1\n/g' | sort -u)
    do
    	stat -c "%Y;%n;%F" -t ${i}* | grep -v directory | sort -n | head -n -5 | cut -d\;  -f2 | xargs echo
    	#stat -c "%Y;%n;%F" -t ${i}* | grep -v directory | sort -n | head -n -5 | cut -d\;  -f2 | xargs rm -f
    done
    Cordialement.

  16. #16
    Membre du Club
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Par défaut
    Salut, désolé de répondre si tard mais j’étais en weekend
    vien dieu! vous m'avez séché... y a des beaux scripts et il va falloir que je comprenne tout ca maintenant...
    Alors pour info la structure est comme ca :
    /tftpboot/save-sw-ur / CM420
    US380
    US240
    US680
    US210
    CM156
    CM890
    Par exemple "CM420" est une usine, "US210" une autre... le nombre de répertoires est bien défini et ne bougera pas (environ 10).

    Finalement la structure du nom de fichier sera plutôt celle ci dessous désolé...
    dans chacun de ces répertoires il y aura cela comme fichiers:
    STACK1-CM420-Feb--4-2013-10-24-11-GMT-0
    STACK1-CM420-Feb-10-2013-10-24-11-GMT-1
    STACK2-CM420-Feb--4-2013-11-24-13-GMT-0
    STACK2-CM420-Feb--4-2013-10-24-14-GMT-2
    STACK2-CM420-Feb-15-2013-10-24-16-GMT-3


    exemple : STACK1-CM420-Feb--4-2013-10-24-10-GMT-0
    Où "STACK1-CM420" est le nom de l’équipement, donc ça ira de "STACK1-CM420" a "STACK6-CM420" par exemple;
    "Feb--4-2013-10-24-10-GMT" c'est la date de création du fichier archive, soit ici le 4 février 2013 a 10h24 et 11 seconde, GMT c'est le fuseau horaire...
    ensuite il y a un chiffre, c'est un incrément sur lequel on ne peut pas se fier (remise a zero si reboot du switch par exemple)

    Bon, je vais essayer de comprendre vos scripts et d'en adapter un pour mon cas...

    Merci de m'avoir aidé, le sujet n'est pas clos... je mettrai résolu quand ca sera ok de mon coté

  17. #17
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 665
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 665
    Par défaut
    Bon, je vais essayer de comprendre vos scripts et d'en adapter un pour mon cas...
    tu peux oublier le mien, il ne fonctionnera pas avec des dates telles que tu les décris.

    du coup, je dois des excuses à disedorgue, car aucun de nous n'avait correctement interprété les dates.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  18. #18
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    aucun de nous n'avait correctement interprété les dates.
    De l'intérêt d'avoir des spécifications précises ou (voire et), au minimum, 4 ou 5 lignes de données variées...

  19. #19
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 362
    Par défaut
    Pas de problème N_Bah, comme tu l'as dit on était tous les deux à coté de la plaque.

    Pour le petit script que j'ai donné, il faut juste modifier la regex du sed:
    ça doit être un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \([[:alnum:]/]*-[[:alnum:]]*\)[[:graph:]]*\( \|$\)
    Cordialement.

  20. #20
    Membre du Club
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Par défaut
    Arffffff bon déjà sache que ton script j'y avais encore rien compris lol... moi je fais du réseau et un peu de système, mais alors le scripting j'y suis allergique ce qui explique mon niveau
    Heuuuu mais là y a aucun script qui marche ?
    Y a pas une commande qui peut regarder la date de création d'un fichier ? car j'ai l’impression que vous vouliez utiliser la date qui est dans le nom... finalement on peut très bien utiliser le début du nom pour identifier le switch et ensuite la date de création du fichier (qui doit faire partie des attributs du fichier ou un truc du genre)
    on m'a proposé ça sur un autre forum:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    cd serveur-tftp
    for USINE in *;do
       cd $USINE
       for SWITCH in $(ls switch* | sed 's/-.*$//' | sort -u); do
           find . -maxdepth 1 -iname "$SWITCH*" -type f -printf "%T@ %p\r\n" | sort | awk '{print $2 }'| head -n -4
       done
       cd ..
    done

    Merci

Discussions similaires

  1. Script qui marche sous Linux mais pas sous Windows et vice versa
    Par tu-phat dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 26/11/2009, 02h39
  2. script php exec sous linux help
    Par pretorien51 dans le forum Apache
    Réponses: 10
    Dernier message: 23/09/2008, 17h39
  3. Scripts de démarrage sous linux
    Par Info_76 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 27/07/2007, 11h35
  4. script php sous linux ???
    Par Florina dans le forum Langage
    Réponses: 5
    Dernier message: 13/12/2005, 17h14
  5. Réponses: 4
    Dernier message: 24/10/2005, 08h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo