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 :

Désarchiver un fichier dans une archive


Sujet :

Shell et commandes GNU

  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut Désarchiver un fichier dans une archive
    Bonjour/Bonsoir

    Je possède une archive

    test.tar

    contenant un dossier dos/
    et des fichiers dos/toto.txt et dos/tata.txt

    A noter que c'est un simple test j'aurais pu en mettre plus et dans d'autres dispositions.


    Le programme principal prend en entrée une archive et au moins un nom de fichiers.
    Si le code de retour de la fonction est 0; on incrémentera de 1 le nombre de fichier extrait.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    if [ $# -lt 2 ]
    then
    	echo "Usage $0 archive.tar fichier.txt [...]";	
    	exit 1;
    fi
    nbExtrait=0;
    archive=$1;
    debut=0;
    for i in `tar -tf $1`
    	do
    	if [ $debut -eq 0 ]
    	then
    		shift 1;
    		debut=1;
    	fi
    	for k in $*
    	do
    		if [ -d $k ]
    		then
    			echo "Usage $0 archive.tar fichier.txt [...]";
    			echo "$k n'est pas un fichier accessible;"
    			exit 2;
    		fi
    		if [ `detarre $archive $k` -eq 0 ]
    		then
    			echo essai; #trace
    			estDansTar $archive $k;
    			nbExtrait=`expr $nbExtrait + 1`;
    		fi
    	done
    done
    if [ $nbExtrait -eq 0 ]
    then
    	echo "Aucun fichier correspondant extrait";
    	exit 3;
    fi
    exit 0;
    Avec la fonction telle que
    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
     
    detarre() {
     
    if [ $# -ne 2 ]
    then
    	echo 1;
    	return 1;
    fi
    for i in `tar -tf $1`
    	do
    	if [ -d $2 ]
    	then
    		echo 2;
    		return 2;
    	fi
    	if [ `basename $i` = $2 ]
    	then
     
    		tar -xf $1 $2;
    		echo 0;
    		return 0;
    	fi
    done
    echo 3;
    return 3;
    }
    La fonction regarde si le fichier qu'on lui passe en argument est dans l'archive; et si oui elle doit le "désarchiver" et c'est là que ça semble coincer.


    Un exemple d'exécution qui se passe bien lorsque le fichier n'est pas dans l'archive.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ./extraireFichierTar.sh test.tar tyty.txt
    Aucun fichier correspondant extrait
    Un exemple qui plante avec un fichier présent dans l'archive

    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
     
    tar: toto.txt : non trouvé dans l'archive
    tar: Arrêt avec code d'échec à cause des erreurs précédentes
    essai
    tar: toto.txt : non trouvé dans l'archive
    tar: Arrêt avec code d'échec à cause des erreurs précédentes
    0
    tar: toto.txt : non trouvé dans l'archive
    tar: Arrêt avec code d'échec à cause des erreurs précédentes
    essai
    tar: toto.txt : non trouvé dans l'archive
    tar: Arrêt avec code d'échec à cause des erreurs précédentes
    0
    tar: toto.txt : non trouvé dans l'archive
    tar: Arrêt avec code d'échec à cause des erreurs précédentes
    essai
    tar: toto.txt : non trouvé dans l'archive
    tar: Arrêt avec code d'échec à cause des erreurs précédentes
    0

    Voilà le tout un peu mieux résumé

  2. #2
    Membre expérimenté
    Avatar de demkada
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Août 2011
    Messages : 79
    Billets dans le blog
    3
    Par défaut
    Salut, si le nom de ta fonction est detarre, pourquoi tu as une ligne avec fonction estDansTar à ce niveau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo essai; #trace 			
    estDansTar $archive $k; 			
    nbExtrait=`expr $nbExtrait + 1`;
    tu l'enlève, et au niveau dutest de la fonction detarre() tu as ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if [ `basename $i` = $2 ] 	
    then   		
    tar -xf $1 $2; 		
    echo 0; 		
    return 0;
    fi
    done
    tu devrais le changer par ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if [ $2 == `basename $i` ]
    then
    tar -xf $1 $i;
    echo 0;
    return 0;
    fi
    done
    Test et tiens moi au courant

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Pardon pour le estDanstar; j'ai changé le nom de la fonction en même temps que ce qu'elle devait faire, donc effectivement elle n'a rien à faire là.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ $2 == `basename $i` ]
    Ceci ne peut que conduire à une erreur; en sh la syntaxe pour la commande test c'est:

    string1 = string2 et non == vérifiable avec man test.

  4. #4
    Membre expérimenté
    Avatar de demkada
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Août 2011
    Messages : 79
    Billets dans le blog
    3
    Par défaut
    Écoute,
    sh ou bash, peu importe le 'test', le vrai problème de ton script se trouve au niveau de la commande tar qui se trouve juste en dessous du 'test'.
    Au niveau du test dont tu parles, fait ce que tu veux (Moi je n'ai pas utilisé de test, c'est l'alternative avec les crochets [ 1==2 ] que j'ai utilisé comme ça l'était dans ton script) mais change ceci par ceci , tout simplement parce que c'est $i (avec son chemin absolu) qui doit être désarchiver et non $2 (qui n'est qu'un basename de $i).
    Fait les changements, testes ton script (ça marchera à coups sûr, et essayes de comprendre pourquoi je te demande de mettre $i et non $2 (réfléchit comme si c'était toi la commande tar) tu comprendras.

    NB: Met le sujet à résolu, car ça l'ai et surtout n'oublie pas de voter pour ma résponse qui t'a aidé à debuguer ton script.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 730
    Par défaut
    le deuxième argument (le nom du fichier) doit aussi comporter le nom du répertoire (dos/) pour être trouvé dans l'archive.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    le deuxième argument (le nom du fichier) doit aussi comporter le nom du répertoire (dos/) pour être trouvé dans l'archive.
    Oui, c'est ce que quelqun m'a expliqué par mp, je ne savais pas qu'il fallait le chemin absolument étant donné que je parcourais l'archive. Du coup j'ai débuggué mon code c’est bon.

    Je te remercie pour ton aide sur la question; et surtout sur le sujet précédent également.


    Moi je n'ai pas utilisé de test, c'est l'alternative avec les crochets [ 1==2 ] que j'ai utilisé comme ça l'était dans ton script
    Que tu utilise la commande test ou des crochets ça ne change rien, la syntaxe c'est

    string1 = string 2
    nombre1 -eq nombre2

    ET non ==

  7. #7
    Membre expérimenté
    Avatar de demkada
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Août 2011
    Messages : 79
    Billets dans le blog
    3
    Par défaut
    Que tu utilise la commande test ou des crochets ça ne change rien, la syntaxe c'est
    string1 = string 2
    nombre1 -eq nombre2
    ET non ==
    Mon cher,
    excuse moi de te contredire mais dès aujourd'hui saches que en bash, pour comparer deux chaînes de caractère c'est "==" et "=" sont tout à fait équivalent.

    L'avantage de == réside dans les commandes test à double crochet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [[ $a == z* ]]    # Vrai si $a commence par 'z' (correspondance d'expression rationnelle)
    [ $a == z* ]      # La correspondance de fichiers et la coupure de mots pourront avoir lieu
    Tandis que l'opérateur '=' beh c'est '='.

    A bon entendeur....

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 730
    Par défaut
    oui, mais Amnael est en sh, pas en bash !

  9. #9
    Membre expérimenté
    Avatar de demkada
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Août 2011
    Messages : 79
    Billets dans le blog
    3
    Par défaut
    Beh écoute N_BAH,
    je ne pense pas qu'il existe un shell qui s'appelle sh.
    En effet le sh n'est qu'un lien symbolique vers l'interpréteur de script par défaut en occurence le shell dash (Debian Almquist Shell) pour les systèmes Debian et dérivé ou un autre shell (bash) pour d'autres famille de distro.
    Pour Redhat et progéniture, aucune idée, mais le sh (bsh) comme tu l’entends je crois qu'il est mort depuis Unix 7.

    Fait: , tu verras que ce n'est qu'un lien vers quelque chose

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 730
    Par défaut
    Ici, quand on dit sh, on veut parler de stricte conformité au standard POSIX.

  11. #11
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 422
    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 422
    Par défaut
    Citation Envoyé par demkada Voir le message
    Beh écoute N_BAH,
    je ne pense pas qu'il existe un shell qui s'appelle sh.
    En effet le sh n'est qu'un lien symbolique vers l'interpréteur de script par défaut en occurence le shell dash (Debian Almquist Shell) pour les systèmes Debian et dérivé ou un autre shell (bash) pour d'autres famille de distro.
    Pour Redhat et progéniture, aucune idée, mais le sh (bsh) comme tu l’entends je crois qu'il est mort depuis Unix 7.

    Fait: , tu verras que ce n'est qu'un lien vers quelque chose

    Autrement dit, il utilise peut être autre chose (Mais pas sh) et quelque soit cette autre chose, avec le petit script qu'il a, == et = sont les même pour les test
    Bonjour,
    Juste pour information, == ne fonctionne pas en dash:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ bash
    $ [ 1 == 1 ] && echo toto
    toto
    $ dash
    $ [ 1 = 1 ] && echo toto
    toto
    $ [ 1 == 1 ] && echo toto
    dash: 2: [: 1: unexpected operator

  12. #12
    Membre expérimenté
    Avatar de demkada
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Août 2011
    Messages : 79
    Billets dans le blog
    3
    Par défaut
    Joli coups d'œil disedorgue.

    Je hisse le drapeau blanc!

  13. #13
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    En parlant d'archive; au cours d'un de mes tests je me suis étonné de quelque chose.


    Ici les $i représenteront toues les adresses de l'archive $1


    Je me suis dis que ce serait quand même sympas de faire un test pour vérifier que les $i sont bien des fichiers.

    Donc j'ai fait un truc du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i in `tar -tf $1`
    do
    if [ -f $i ]
    then
    echo OK;
    fi
    done
    Et à ma grande surprise le if ne passe pas c'est à dire que l'on ne rentre jamais dans cette condition; ce qui voudrait dire que les fichiers de l'archives ne sont pas vraiment des fichiers ? [...]

    Ce bout de script là ne produirait donc aucun affichage.

    Auriez vous une explication à ce sujet ?

  14. #14
    Membre expérimenté
    Avatar de demkada
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Août 2011
    Messages : 79
    Billets dans le blog
    3
    Par défaut
    Beh,
    ton bout de script marche bien chez moi en tout cas!

  15. #15
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Citation Envoyé par demkada Voir le message
    Beh,
    ton bout de script marche bien chez moi en tout cas!
    Étrange

    Par exemple mon archive contient

    dos/f1.txt
    dos/f2.txt

    Je devrais donc avoir OK qui s'affiche deux fois avec ce code...mais non rien du tout.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 730
    Par défaut
    quel est le contenu du répertoire sur lequel est exécuté le script ? y existe-t-il un répertoire dos, où existent des fichiers f{1,2}.txt ?

  17. #17
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    quel est le contenu du répertoire sur lequel est exécuté le script ? y existe-t-il un répertoire dos, où existent des fichiers f{1,2}.txt ?
    Non il y a simplement des scripts et l'archive contenant le répertoire avec les fichiers.

    Le répertoire présent dans l'archive se situe dans le dossier parent du répertoire courant donc ça ne devrait pas interférer avec le script normalement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 730
    Par défaut
    le test opère sur la hiérarchie présente sur le système, et pas sur celle de l'archive.

  19. #19
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Cela veut donc dire que l'on ne peut pas tester que le contenu dans une archive est bien un fichier ou un dossier ou autre chose ?

    Ou alors il faut passer par un artifice et regarder si la chaîne de caractère se termine par un .txt ?


    EDIT: ET dernière chose après j pense que je peux vous laisser tranquille =)

    On peut inspecter une archive avec les option tf.

    Mais certaines commandes (comme md5sum) demande à être utilisé à partir du répertoire courant

    Hors l'archive est considéré comme un fichier et donc écrire quelque chose comme

    md5sum archive.tar/dos/f1.txt est faux car archive.tar est un fichier.

    Ce qui veut dire que pour obtenir l'empreinte du fichier f1.txt on est obligé de le désarchiver et ça c'est quand même pas cool...

  20. #20
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Citation Envoyé par Amnael Voir le message
    Ce qui veut dire que pour obtenir l'empreinte du fichier f1.txt on est obligé de le désarchiver et ça c'est quand même pas cool...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tar -xOf archive.tar dos/f1.txt | md5sum
    Références

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

Discussions similaires

  1. Récupérer un fichier dans une archive avec ZLIB
    Par Petiois dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 31/12/2012, 12h58
  2. Fonction pour lire des fichiers dans une archive MPQ
    Par MegaBigBoss dans le forum Débuter
    Réponses: 0
    Dernier message: 28/01/2012, 23h02
  3. Ajouter un fichier dans une archive zip existante
    Par dawadam dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 31/05/2010, 13h19
  4. Réponses: 4
    Dernier message: 26/01/2006, 13h12
  5. [C#] [WinForms] Lecture d'un fichier dans une archive ZIP
    Par aegypius dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/12/2004, 18h15

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