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 :

Tri dans un dossier d'archives (script shell?)


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Par défaut Tri dans un dossier d'archives (script shell?)
    Bonjour à tous,

    Alors voila, j'ai un dossier contenant des archives. Elle sont toutes nommées comme ceci : xxxx-0001, xxxx-0002, .. Le nombre en gras détermine l’ancienneté de l'archive (l'archive se terminant par "0003" est plus ancienne que celle qui se termine par "0005" mais plus récente que celle qui se termine par "0002" etc..) Dans chacune des archives, il y a un fichier XML. Or le fichier XML peut être le même dans plusieurs archives (le même = même nom de fichier).
    Ce que je souhaite c'est ne garder que l'archive la plus recente par fichier XML unique.

    Par exemple si l'archive xxxx-0003 et xxxx-0034 contiennent le même fichier XML, l'archive xxxx-0003 soit supprimée.

    Je voulais savoir quelle étaient les solutions possibles et vu qu'on m'a parle de script SHELL, la difficulté de ce dernier.

    Merci d'avance à tous ceux qui m'apporteront leur aide.

    EDIT : Merci disedorgue. Oui en effet en relisant, j'ai dit l'inverse de ce que je voulais Modifié !

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 339
    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 339
    Par défaut
    Bonjour,
    Citation Envoyé par DarKaa Voir le message
    Bonjour à tous,

    Alors voila, j'ai un dossier contenant des archives. Elle sont toutes nommées comme ceci : xxxx-0001, xxxx-0002, .. Le nombre en gras détermine l’ancienneté de l'archive (l'archive se terminant par "0003" est plus ancienne que celle qui se termine par "0005" mais plus récente que celle qui se termine par "0002" etc..) Dans chacune des archives, il y a un fichier XML. Or le fichier XML peut être le même dans plusieurs archives (le même = même nom de fichier).
    Ce que je souhaite c'est ne garder que l'archive la plus ancienne par fichier XML unique.

    Par exemple si l'archive xxxx-0003 et xxxx-0034 contiennent le même fichier XML, l'archive xxxx-0003 soit supprimée.

    Je voulais savoir quelle étaient les solutions possibles et vu qu'on m'a parle de script SHELL, la difficulté de ce dernier.

    Merci d'avance à tous ceux qui m'apporteront leur aide.
    En rouge, ce qui semble incohérent.

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 283
    Par défaut
    Bonjour,

    c'est quoi une archive ? tar ? zip ? tar.gz ?

    Un exemple de ce qui est possible:

    Des archives:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ find  /tmp/ -iname "testarchive*" | sort
    /tmp/testarchive001.tar.gz
    /tmp/testarchive002.tar.gz
    /tmp/testarchive003.tar.gz
    /tmp/testarchive004.tar.gz
    Les archives et le fichier ciblé (ici un txt mais ça peut être un xml):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ find  /tmp/ -iname "testarchive*" | sort| xargs -ITT bash -c 'echo -ne TT"\t";tar -ztf TT'
    /tmp/testarchive001.tar.gz      titi.txt
    /tmp/testarchive002.tar.gz      titi.txt
    /tmp/testarchive003.tar.gz      toto.txt
    /tmp/testarchive004.tar.gz      titi.txt
    On sépare les champs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ find  /tmp/ -iname "testarchive*" | sort| xargs -ITT bash -c 'echo -ne TT"\t";tar -ztf TT'|sed 's/.*testarchive/&\t/;s/.tar.gz.*/\t&/'
    /tmp/testarchive        001     .tar.gz titi.txt
    /tmp/testarchive        002     .tar.gz titi.txt
    /tmp/testarchive        003     .tar.gz toto.txt
    /tmp/testarchive        004     .tar.gz titi.txt
    La liste des archives à garder:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ find  /tmp/ -iname "testarchive*" | sort| xargs -ITT bash -c 'echo -ne TT"\t";tar -ztf TT'|sed 's/.*testarchive/&\t/;s/.tar.gz.*/\t&/'|awk '{mem[$4]=$2} END{for (fic in mem) print "/tmp/testarchive"mem[fic]".tar.gz";}'
    /tmp/testarchive003.tar.gz
    /tmp/testarchive004.tar.gz
    Il ne reste plus qu'à soustraire ces adresses de la liste des fichiers supprimables (grep -v -f) et de supprimer (rm -i ou rm -f).

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Par défaut
    Bonjour et merci de ta réponse.

    Alors d'abord oui ce sont des archives .zip

    Ensuite j'avoue être un débutant (et encore c'est beaucoup dire) pour ce qui est script shell

    Moi j’étais un peu parti vers quelque chose comme ça (j'avance pas par pas ) :

    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
     
    #!/bin/zsh
     
    getFiles() {
       Rep="$1"
       for item in $Rep/* //parcourir les archives
       do 
       [ -f "$item" ] && file=$(echo "$item") #je stocke le nom du fichier dans une variable
       unzip $file #je dezip l'archive (et faudrait que je stocke le fichier XML qu'il y a dedans)
       #pseudo code car j'en suis la :
       #reparcourir les archives en partant de la ou je suis dans le répertoire
       #en deziper une et comparer les nom des fichiers XML
       #si les noms sont identiques, je supprime la première archive et les fichiers XML qui ont été extraits et je continue
       done
    }
     
    [ -d "${1:-.}" ] && getFiles ${1:-.}
    Quand je vois qu'en une ligne tu arrives deja a faire les comparaisons etc.. Je me dis que je passe a cote de quelque chose mais j'avoue ne pas trop comprendre ce que tu as fait.

  5. #5
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 283
    Par défaut
    Déjà, le $, c'est l'invite de commande ... il ne faut pas la reprendre.

    Après j'utilise une conduite, une suite de commandes séparés par un pipe |, qui donne à la commande suivante le résultat de son travail sur ce que lui a donné la commande précédente
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ commande1 | commande2 | commande3
    Du coup, au lieu de faire une boucle sur les fichiers comme tu le fais, je travaille directement avec "un fichier" qui contient la liste de mes cibles, récupérées par un find. Les deux sont bien, c'est une question de préférence.

    Je m'assure que les plus récents seront les plus bas dans la liste en la triant avec sort.

    Puis je traite les cibles une à une avec xargs en demandant d'afficher (echo) le nom et le contenu (tar -t).

    Ensuite, je sépare le numéro avec sed pour le traiter dans awk. Certains vont hurler car awk peut le faire. Question de préférence, encore.

    Enfin, la commande awk permet de transformer un fichier texte en considérant ses "champs". C'est la 2ème et la 4ème colonne qui nous intéressent. On ne garde que le plus récent numéro pour un nom de fichier contenu dans l'archive.

    Avec grep, on filtre la liste des archives avec la liste qu'on vient d'obtenir.

    Et avec rm, on supprime tout ça.

    Est-ce plus clair? Y a pas mal à étudier.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Par défaut
    Merci encore.

    Oui ça va (un peu) mieux quand c'est découpé car je connais ces commandes c'est juste que c’était en première année et que les arguments et les paramètres sont un peu tordu

    Bon alors j'ai cree trois archives :
    - AKO_01.zip (contenant le fichier "1.xml")
    - AKO_02.zip (contenant le fichier "2.xml")
    - AKO_03.zip (contenant le fichier "1.xml")

    Et j'aimerai après exécution du script qu'il me reste AKO_02.zip et AKO_03.zip (suivant la règle de gestion décrite)

    et j'ai tente d'utiliser la commande que tu m'as donne mais je trébuche très vite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    find . -iname "AKO_*" | sort| xargs -ITT bash -c 'echo -ne TT"\t";unzip TT'|sed 's/.*AKO_/&\t/;s/.zip.*/\t&/'|awk '{mem[$4]=$2} END{for (fic in mem) print "./AKO_"mem[fic]".zip";}'
    La sortie n'est pas terrible..

    Puis comme en fait c'est les XML qui m’intéresse (donc n'avoir après l’exécution du script) que les fichiers "2.xml" et "1.xml" (mais de l'archive AKO_03.zip)
    Ne serait pas plus simple de boucler sur les archives rangées et faire un unzip -u (qui écraserait les xml portant le même nom) ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [bash]erreurs dans l'écriture d'un script shell
    Par homeostasie dans le forum Linux
    Réponses: 3
    Dernier message: 23/03/2009, 16h09
  2. Réponses: 2
    Dernier message: 07/11/2006, 10h34
  3. Programme en C dans un script shell
    Par am.adnane dans le forum Linux
    Réponses: 1
    Dernier message: 05/02/2006, 17h57
  4. Syntaxe dans un script shell
    Par cubepiege dans le forum Linux
    Réponses: 5
    Dernier message: 27/09/2005, 16h21
  5. Script shell - écriture dans un fichier
    Par Leishmaniose dans le forum Linux
    Réponses: 6
    Dernier message: 13/12/2004, 22h48

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