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