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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 663
    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.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  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....

+ 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, 11h58
  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, 22h02
  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, 12h19
  4. Réponses: 4
    Dernier message: 26/01/2006, 12h12
  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, 17h15

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