Forum Programmation.shell Décompresser plusieurs tar.gz. files à l’intérieur de plusieurs dossiers

Posté par  . Licence CC By‑SA.
Étiquettes :
1
10
juil.
2018

Salut à tous,

J'essaye de décompresser plusieurs fichiers tar.gz contenus dans plusieurs dossiers via a script shell avec une fonction "loop".

l'arborescence c'est semblable a ceci :

/folder/001
/folder/002
/folder/003

A l'intérieur de chaque dossier (001,002,003) j'ai 1, parfois plusieurs fichiers tar.gz.

Mon script c'est ceci :
!/bin/bash
liste_fichier="/folder/"
for fichier in $liste_fichier do
tar -xzvf $fichier/.tar.gz --directory $fichier/
done
exit

Problème:
Le script fonctionne uniquement quand il existe un seul fichier tar.gz dans le dossier.
Si plus d'un fichier tar.gz je reçois le message "tar : : non trouvé dans l'archive"

Autre tests effectués:
- J'ai testé le code suivant à l'intérieur d'un seul dossier (001) contenant plusieurs tar.gz files:
for i in *.tar.gz
do
tar -xzvf $i
done
Et ça marche.
- j'ai essayé de exécuter le code ci-dessus à l'intérieur d'un autre loop dans le fichier shell sans sucées.

Des idées son les bienvenues.

  • # Quelques suggestions :

    Posté par  . Évalué à 1. Dernière modification le 10 juillet 2018 à 17:12.

    Premierment :

    Quelques questions complémentaires.

    les fichiers à décompresser sont-ils présents dans le répertoire folder.

    Doit-on les décompresser dans le même répertoire ?

    Je ne pense pas que celui-ci soit fonctionnel

    !/bin/bash
    liste_fichier="/folder/"
    for fichier in $liste_fichier do
    tar -xzvf $fichier/.tar.gz --directory $fichier/
    done
    exit

    Voici une base elle est à compléter avec les contrôles sur les paramètres et l'usage multi dossier

        #!/bin/bash 
    
        #et tu peux mettre en parametre le repertoire désiré
        rep="/folder" 
        #je liste les fichiers 
        liste_fichier="$( ls "$rep"/*.tar.gz ) "
        for fichier in $liste fichier 
        do
    
        tar -zxvf "$rep/$fichier" --directory "`{mathjax} rep" || exit "`?"
    
        done
    
    
        exit O
    

    Ce n'est pas parfait mais ça doit fonctionner

  • # Reponse

    Posté par  . Évalué à 0. Dernière modification le 11 juillet 2018 à 11:03.

    J'ai avait oublié un détails dans mon script les "*":

    !/bin/bash
    liste_fichier="/folder/" ## ici
    for fichier in $liste_fichier do
    tar -xzvf $fichier/
    .tar.gz --directory $fichier/ ##et ici dans *.tar.gz
    done
    exit

    Maintenant, j'ai bien testé ton code,

    Mais pendant l’exécution du script j'ai l'erreur suivant :
    ls : impossible d'accéder à /folder//.tar.gz Aucun fichier de ce type

    Et le problème survient du fait que:
    la variable
    prompt> rep="/folder/*"

    les résulta de la variable $rep via un echo done
    /folder/001 /folder/002 /folder/003 ## jusqu'à ici c'est correct

    Mais quand j'attribue "$(ls "$rep"/.tar.gz") " à liste_fichier
    prompt> liste_fichier="$(ls "$rep"/
    .tar.gz") "

    je obtien le message de erreur pendant l'execution du script
    ls : impossible d'accéder à folder/001//.tar.gz Aucun fichier de ce type

    En faite il traite pas la variable "rep" de la même façon quand je l'utilise dans une autre variable.
    Ce qu'il a fait il a juste repris rep="/folder/*" et non le résultat de la variable (/folder/001 /folder/002 /folder/003

    Donc la question, comment utiliser le résultat d'une variable dans une autre?

    • [^] # Re: Reponse

      Posté par  . Évalué à 2.

      en effet car ce n'est pas ce que j'ai indiqué dans mon post :
      J'ai écrit :
      rep="/folder" # sans / à la fin

      et j'ai également écrit :

      liste_fichier=$( ls "$rep"/[wildcard].tar.gz ) # et j'ai bien mis un espace la parenthèse et et ls et entre z et la parenthèse ce qui a une importance syntaxique.
      et les guillemet ne sont qu'autour de $rep
      si turespecte cette syntaxe ça marche :P
      ici le [ wildcard ] remplace l'étoile

      La syntaxe a son importance.

      • [^] # Re: Reponse

        Posté par  . Évalué à 1.

        J'ai bien effectué les corrections, et ça ne marche pas.
        J'ai des erreurs :
        -bash: {mathjax} : commande introuvable
        tar(child) folder/fichier : la focntion open a échoué: aucun fichier de ce type

        • [^] # Re: Reponse

          Posté par  . Évalué à 1. Dernière modification le 12 juillet 2018 à 15:29.

          en fait un truc bizarre c'est passé lors que j'ai écrit dans le forum

          pour
          "`{mathjax} rep"
          il fallait comprendre :
          "$rep"

          désolé :)

          • [^] # Re: Reponse

            Posté par  . Évalué à 1.

            Aucun souci,

            Mais le batch se términe toujours en échec.
            ls: impossible d'accéder à folder/*.tar.gz : aucun fichier de ce type

            en effet,
            Les tar.gz si trouve dans
            /folder/001
            /folder/002
            /folder/003

            • [^] # Re: Reponse

              Posté par  . Évalué à 1.

              dans ce cas il faut préciser le cahier des charges :D

  • # Double post

    Posté par  . Évalué à 1.

    Tu as fait un double post, j’ai répondu ici

Suivre le flux des commentaires

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