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é