Salut,
J'essaye de decompresser plusiers fichiers tar.gz contenus dans plusieurs dossiers via a script shell avec une fonction "loop".
l'arborescence c'est sembalable 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 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 sans sucées.
toutes les idées son les bienvenues.
# 2 boucles
Posté par Anthony Jaguenaud . Évalué à 2.
Salut,
Dans ta ligne :
Il manque le
*
devant le.tar.gz
Sinon, je ferai plutôt en deux boucles avec une variable
repertoire
. Ta variablefichier
est en fait une liste de répertoire, et ce n’est pas clair quand on lit.# Boucle correcte - destination erroné
Posté par shellx . Évalué à 1. Dernière modification le 11 juillet 2018 à 15:42.
Merci Anthony,
Cela a réglé un problème et soulevé un autre.
Voici tout l'historique:
Arborescence
[shellx] $ ls -l folder
total 16
drwxr-xr-x 2 shellx mrv 4096 11 juil. 14:36 001
drwxr-xr-x 2 shellx mrv 4096 11 juil. 14:37 002
drwxr-xr-x 2 shellx mrv 4096 11 juil. 14:37 003
drwxr-xr-x 2 shellx mrv 4096 11 juil. 14:34 004
Contenu des dossiers
[shellx] $ ls folder/*
folder/001:
CARDV022A0.tar.gz CARDV02976.tar.gz CARDV02A0.tar.gz CARDV976.tar.gz
folder/002:
CARDV02976.tar.gz CARDV976.tar.gz
folder/003:
CARDV022A0.tar.gz CARDV02976.tar.gz CARDV976.tar.gz
folder/004:
CARDV02976.tar.gz CARDV976.tar.gz
Script suivant ta suggestion
!/bin/bash
liste_rep="/folder/"
echo "LISTE REP :" $liste_rep
for rep in "$liste_rep"
do
for fichier in $liste_rep/.tar.gz
do
liste_rep="/folder/*"
echo "FICHIER :" $fichier
tar -zxvf "$fichier"
done
done
exit
Problème
Les fichiers sont tous décompressées dans le dossier de exécution du shell script et non pas à l'intérieur des chaque dossier. Or les tar.gz contiennent de fichier avec des noms identiques, et ils sont tous écrasés.
j'ai essayé avec les option ci-dessous
En rajoutant les paramètres suivants dans la ligne respective :
tar -zxvf "$fichier" -C $liste_rep
Le erreur suivant est affiché à l’écran pendant l'execution du script:
LISTE REP : /folder/001 /folder/002 /folder/003 /folder/004
FICHIER : /folder/001/CARDV022A0.tar.gz
tar: /folder/002 : non trouvé dans l'archive
tar: /folder/003 : non trouvé dans l'archive
tar: /folder/004 : non trouvé dans l'archive
tar: Arrêt avec code d'échec à cause des erreurs précédentes
FICHIER : /folder/001/CARDV02976.tar.gz
tar: /folder/002 : non trouvé dans l'archive
tar: /folder/003 : non trouvé dans l'archive
tar: /folder/004 : non trouvé dans l'archive
tar: Arrêt avec code d'échec à cause des erreurs précédentes
FICHIER : /folder/001/CARDV02A0.tar.gz
tar: /folder/002 : non trouvé dans l'archive
tar: /folder/003 : non trouvé dans l'archive
tar: /folder/004 : non trouvé dans l'archive
.
.
.
FICHIER : /folder/004/CARDV02A0.tar.gz
En faite la variable "$liste_rep" n'est pas très bien en compte à l'intérieur de la deuxième boucle.
Des idées?
Merci d'avance
[^] # Re: Boucle correcte - destination erroné
Posté par Anthony Jaguenaud . Évalué à 2.
Tu peux changer de répertoire pour te mettre dans le répertoire du fichier.
Tu peux utiliser
dirname
, ou uncd
avant et après la boucle imbriquée.Pour un meilleur apprentissage, je te laisse me répondre avec la bonne solution. Si tu n’y arrive toujours pas, j’essayerai de te guider plus précisément.
[^] # Re: Boucle correcte - destination erroné
Posté par shellx . Évalué à 1.
J'ai bien essayé et testé plusieurs solutions, l'exécution se termine soit en échec soit en erroné.
Voic le code retouché.
J'ai bien effectué des changements de répertoire rien y fait.
J'ai rajouté une variable
```ruby
folder="$(ls folder)" ##afin de recupérer uniquement les sub dossier 001 002 003 004
end
```
Les contenu des variables s'affiche correctement
ruby
[presta2] $ echo $liste_rep
folder/001 folder/002 folder/003 folder/004
-(jeu. juil. 12 10:13:41)--(mrvpgsa001:~)-
[presta2] $ echo $folder
001 002 003 004
end
Resultat d’exécution
J'ai insérer 3 outputs à chaque étape de la boucle,
tar: folder/002 : non trouvé dans l'archive ---> Comment non tropuvé si --> tar -zxvf $fichier
tar: folder/003 : non trouvé dans l'archive
tar: folder/004 : non trouvé dans l'archive
tar: Arrêt avec code d'échec à cause des erreurs précédentes
FICHIER : folder/001/CARDV02976.tar.gz
tar: folder/002 : non trouvé dans l'archive
tar: folder/003 : non trouvé dans l'archive
tar: folder/004 : non trouvé dans l'archive
tar: Arrêt avec code d'échec à cause des erreurs précédentes
FICHIER : folder/001/CARDV02A0.tar.gz
tar: folder/002 : non trouvé dans l'archive
tar: folder/003 : non trouvé dans l'archive
tar: folder/004 : non trouvé dans l'archive
tar: Arrêt avec code d'échec à cause des erreurs précédentes
FICHIER : folder/001/CARDV976.tar.gz
Si on enlever le commentaire sur #cd $liste_rep
Les message d'erreur est la suivante
[presta2] $ ./decomp2.sh*
LISTE REP : folder/001 folder/002 folder/003 folder/004
AFFICHE REP :folder/*
FICHIER : folder/001/CARDV022A0.tar.gz
tar (child): folder/001/CARDV022A0.tar.gz : la fonction open a échoué: Aucun fichier ou dossier de ce type
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
FICHIER : folder/001/CARDV02976.tar.gz
tar (child): folder/001/CARDV02976.tar.gz : la fonction open a échoué: Aucun fichier ou dossier de ce type
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
Des idées?
Merci d'avance
[^] # Re: Boucle correcte - destination erroné
Posté par Anthony Jaguenaud . Évalué à 2.
Je mets des commentaires
#-
Aller, je reviens après mangé.
[^] # Re: Boucle correcte - destination erroné
Posté par shellx . Évalué à 1. Dernière modification le 12 juillet 2018 à 13:07.
J'ai effectué les modifications sugérres, mais j'ai réussi uniquement a decompresser tous les tar.gz au même endroit pour l'instant.
Et merci pour les commentaires et les explications.
[^] # Re: Boucle correcte - destination erroné
Posté par Anthony Jaguenaud . Évalué à 2.
Je reprends et termine.
Néanmoins on peut faire plus simple : (avec 2 boucles)
Autre solution avec une seule boucle. On profite que bash sait étendre plusieurs
*
L’avantage de la deuxième solutions c’est que c’est plus court. L’inconvénient c’est que tu as beaucoup plus de changement de répertoire.
Le
cd -
affiche le répertoire de destination, si ça pollue ton affichage, il faut rediriger la sortie vers/dev/null
.Sinon, je n’ai pas vérifié, il est probable qu’il y ait des erreurs de syntaxes.
Une dernière pour la route, on reprend la première solution et on vire la boucle. N’hésite pas a faire
man
des commandes utilisées.[^] # Re: Boucle correcte - destination erroné
Posté par shellx . Évalué à 1. Dernière modification le 12 juillet 2018 à 14:58.
J'ai tout testé, malheureusement sans sucées.
SOLUTION 1
Resultat # decomprésse juste folder 001 à la racine
[shellx] $ ./decomp4.sh
folder/001 folder/002 folder/003 folder/004
./decomp4.sh: line 6: cd: folder/*: Aucun fichier ou dossier de ce type
./
./list_fic
./BATI
./DLOT
./FANR
./FPDL
./NBAT
./PARA
./PROP
./decomp4.sh: line 12: cd: « OLDPWD » non défini
SOLUTION 2
Resultat -> Les fichiers ont tous été decompressées à la racine et ecrassées
Le nom des fichiers tar.gz sont diferents mais les noms de fichiers contenu dans les tar.gz est identique.
[shellx] $ ./decomp_sol2.sh
./decomp_sol2.sh: line 5: cd: folder/001*: Aucun fichier ou dossier de ce type
./
./list_fic
./6034_BATI_2014
./6035_NBAT_2014
./decomp_sol2.sh: line 7: cd: « OLDPWD » non défini
./decomp_sol2.sh: line 5: cd: folder/001*: Aucun fichier ou dossier de ce type
./
./6035_NBAT_2014
./list_fic
./6034_BATI_2014
./decomp_sol2.sh: line 7: cd: « OLDPWD » non défini
./decomp_sol2.sh: line 5: cd: folder/001*: Aucun fichier ou dossier de ce type
./
./list_fic
./BATI
./DLOT
./FANR
./FPDL
./NBAT
./PARA
./PROP
./decomp_sol2.sh: line 7: cd: « OLDPWD » non défini
./decomp_sol2.sh: line 5: cd: folder/001*: Aucun fichier ou dossier de ce type
./
./NBAT
./PARA
./FPDL
./DLOT
./FANR
./PROP
./BATI
./list_fic
./decomp_sol2.sh: line 7: cd: « OLDPWD » non défini
./decomp_sol2.sh: line 5: cd: folder/002*: Aucun fichier ou dossier de ce type
./
./6035_NBAT_2014
./list_fic
./6034_BATI_2014
./decomp_sol2.sh: line 7: cd: « OLDPWD » non défini
./decomp_sol2.sh: line 5: cd: folder/002*: Aucun fichier ou dossier de ce type
./
./NBAT
./PARA
./FPDL
./DLOT
./FANR
./PROP
./BATI
./list_fic
./decomp_sol2.sh: line 7: cd: « OLDPWD » non défini
./decomp_sol2.sh: line 5: cd: folder/003*: Aucun fichier ou dossier de ce type
./
./list_fic
./6034_BATI_2014
./6035_NBAT_2014
./decomp_sol2.sh: line 7: cd: « OLDPWD » non défini
./decomp_sol2.sh: line 5: cd: folder/003*: Aucun fichier ou dossier de ce type
./
./6035_NBAT_2014
./list_fic
./6034_BATI_2014
./decomp_sol2.sh: line 7: cd: « OLDPWD » non défini
./decomp_sol2.sh: line 5: cd: folder/003*: Aucun fichier ou dossier de ce type
./
./NBAT
./PARA
./FPDL
./DLOT
./FANR
./PROP
./BATI
./list_fic
./decomp_sol2.sh: line 7: cd: « OLDPWD » non défini
./decomp_sol2.sh: line 5: cd: folder/004*: Aucun fichier ou dossier de ce type
./
./6035_NBAT_2014
./list_fic
./6034_BATI_2014
./decomp_sol2.sh: line 7: cd: « OLDPWD » non défini
./decomp_sol2.sh: line 5: cd: folder/004*: Aucun fichier ou dossier de ce type
./
./NBAT
./PARA
./FPDL
./DLOT
./FANR
./PROP
./BATI
./list_fic
./decomp_sol2.sh: line 7: cd: « OLDPWD » non défini
SOLUTION 3
[shellx] $ ./decomp_sol3.sh
folder/001 folder/002 folder/003 folder/004
./decomp_sol3.sh: line 6: cd: folder/*: Aucun fichier ou dossier de ce type
./
./list_fic
./BATI
./DLOT
./FANR
./FPDL
./NBAT
./PARA
./PROP
SOLUTION 3 bis ## J'ai enlevé le guimets pour "$rep"
Les fichiers sont bien decompréses uniquement dans le dossier 001 (bouvle pas sur 002 003 004 )
folder/001 folder/002 folder/003 folder/004
./
./list_fic
./6034_BATI_2014
./6035_NBAT_2014
./
./6035_NBAT_2014
./list_fic
./6034_BATI_2014
./
./list_fic
./BATI
./DLOT
./FANR
./FPDL
./NBAT
./PARA
./PROP
./
./NBAT
./PARA
./FPDL
./DLOT
./FANR
./PROP
./BATI
./list_fic
J'ai effectué pas mal de tests, et je suis arrivé au même résultat.
[^] # Re: Boucle correcte - destination erroné
Posté par Anthony Jaguenaud . Évalué à 2.
Si je comprends, par exemple : dans le répertoire 001 tu as deux fichiers : toto.tar.gz et tata.tar.gz contenant bin/mon_logiciel tous les deux.
Tu voudrais avoir : 001/toto/bin/mon_logiciel et 001/tata/bin/mon_logiciel.
Pour ça, tu ajoutes ça avant le tar :
Par contre le
cd -
ne pourra pas retourner vers le répertoire voulu… Regarde du côté depushd
etpopd
.[^] # Re: Boucle correcte - destination erroné
Posté par shellx . Évalué à 1. Dernière modification le 12 juillet 2018 à 16:00.
Non,
Les tar.gz contienne des fichiers text
[shellx] $ ls folder/*
folder/001:
CARDV022A0.tar.gz --> Contient fichier "cardv22"
CARDV02976.tar.gz—> contiernt fichier "cardv29"
CARDV02A0.tar.gz --> contient fichier "cardv2"
CARDV976.tar.gz --> contient fichier "cardv9"
folder/002:
CARDV02976.tar.gz --> contient fichier "cardv29" mais le contenu de cardv29 de ce folder/002 d est different ddu fichier "cardv29" /folder/001
CARDV976.tar.gz --> Pareil pour le cardv29 - le noms de tar sont identiques, les nom de fichiers extraint aussi, mais les contenu des fichiers extraits sont difrentes pour chauqe folder 001 002 003 004
folder/003:
CARDV022A0.tar.gz
CARDV02976.tar.gz
CARDV976.tar.gz
folder/004:
CARDV02976.tar.gz CARDV976.tar.gz
j'ai fait echo avec la variable avec et sans guilemets.
C'est noté. Merci
# Cet Interface ne affiche pas les etoiles "*"
Posté par shellx . Évalué à 1. Dernière modification le 11 juillet 2018 à 15:49.
===========Attention
Cet interface n'affiche pas les étoiles "" dans
liste_rep="/folder/"
et
"*.tar.gz"
[^] # Re: Cet Interface ne affiche pas les etoiles "*"
Posté par Anthony Jaguenaud . Évalué à 2.
Il faut mettre 3 « anti-cote »
<altgr>+<7>
Tu vois avec ruby tout en bas de la page de réponse.En remplaçant ruby par bash ça fait joli.
Sous les commentaires tu as un lien « répondre » qui permet de hiérarchiser les réponses. C’est plus agréable que de toujours commencer un nouveau commentaire.
[^] # Re: Cet Interface ne affiche pas les etoiles "*"
Posté par shellx . Évalué à 1.
# Eureka ....
Posté par shellx . Évalué à 1. Dernière modification le 12 juillet 2018 à 18:33.
Enfin, la lumière
En faite toute le probléme survenait de l'utilisation de "" guilemets
J'ai testé le code ci-dessous avec sucées:
Merci de ton aide.
[^] # Re: Eureka ....
Posté par Anthony Jaguenaud . Évalué à 2.
Super, content d’avoir pu aider. Par contre, je me pose une question pourquoi tu as ça à la fin de ton fichier ?
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.