web-dev-qa-db-fra.com

Erreur du shell «tar: introuvable dans l'archive» lors de l'utilisation d'une expression régulière

Lorsque j'utilise tar -xzf *.gz pour extraire tous les .gz fichiers dans le répertoire courant, j'obtiens Not found in archive Erreur. Cependant, cela fonctionne très bien si j'extrais un par un ou utilise une boucle for comme

for file in `ls *.gz`; do tar -xzf $file; done

Quelle est la raison de cette erreur?

23
Zhiwen Fang

Lorsque vous écrivez:

tar -xf *.gz

la commande tar voit (par exemple):

tar -xf abc.tar.gz def.tar.gz ghi.tar.gz

Ceci est interprété comme une demande d'extraire def.tar.gz et ghi.tar.gz de l'archive abc.tar.gz. Étant donné que les fichiers ne s'y trouvent pas, vous obtenez le message d'avertissement.

En d'autres termes, tar fonctionne sur un seul fichier tar (éventuellement compressé) à la fois (en une seule invocation). Il ne fonctionne pas sur plusieurs fichiers tar.

Notez que si abc.tar.gz contient un fichier pqr/xyz/important.c, vous pouvez extraire un seul fichier en spécifiant:

tar -xf abc.tar.gz pqr/xyz/important.c

La notation que vous avez utilisée n'est qu'une variante de cette notation.

(Et oui, il peut y avoir des raisons de tar un fichier tar. Par exemple, Gmail ne vous permet pas d'expédier un fichier tar ou un fichier tar compressé qui contient un fichier exécutable. Cependant, si vous incorporez un fichier tar gzippé dans un fichier tar non compressé, il ne regarde pas à l'intérieur du fichier interne pour trouver le fichier exécutable. Je l'utilise lorsque j'ai besoin d'envoyer un fichier tar avec un exécutable configure script.)

25
Jonathan Leffler

Quand tu écris

 tar -xzf *.gz

votre Shell l'étend à la chaîne:

 tar -xzf 1.gz 2.gz 3.gz

(en supposant que 1.gz, 2.gz et 3.gz se trouvent dans votre répertoire actuel).

tar pense que vous voulez extraire 2.gz et 3.gz de 1.gz; il ne trouve pas ces fichiers dans les archives et cela provoque le message d'erreur.

Vous devez utiliser la boucle for de la commande xargs pour extraire vos fichiers.

ls *.gz |xargs -n1 tar -xzf

Cela signifie: exécutez-moi tar -xzf pour chaque gz- fichier dans le répertoire courant.

25
Igor Chubin

la raison principale est que tar prend un seul argument de nom de fichier. Lorsque vous appelez tar *.tgz bash étend le * à tous les noms de fichiers avec tgz formant et il devient tar file1 file2 file3 qui n'est pas accepté par tar. Donc, soit vous utilisez une boucle for comme for i in *.tgz; do tar -zxvf $i ;done ou utilisez une autre commande qui exécute tar comme effet secondaire comme indiqué dans les commentaires, est ls ou find . -maxdepth 1 -name \*tgz -exec tar -zxvf {} \; (ls la sortie est toujours risquée)

3
abasu