Erreur Shell 'tar: introuvable dans l'archive' lors de l'utilisation de l'expression régulière
Lorsque j'utilise tar -xzf *.gz
pour extraire tous les .gz
fichiers dans le répertoire courant, je reçois Not found in archive
erreur. Cependant, il fonctionne très bien si je l'extrait de l'un par l'un ou l'utilisation d'une boucle for comme
for file in `ls *.gz`; do tar -xzf $file; done
Quelle est la raison de cette erreur?
source d'informationauteur Zhiwen Fang
Vous devez vous connecter pour publier un commentaire.
Lorsque vous écrivez:
la
tar
commande voit (par exemple):C'est interprétée comme une demande d'extrait de
def.tar.gz
etghi.tar.gz
à partir de l'archiveabc.tar.gz
. Étant donné que les fichiers ne sont pas là, vous obtenez le message d'avertissement.En d'autres termes,
tar
opère sur un seultar
fichier (éventuellement compressé) à un moment (dans une invocation). Il n'a pas d'agir sur plusieurs fichiers tar.Noter que si
abc.tar.gz
contient un fichierpqr/xyz/important.c
vous pouvez extraire un fichier en spécifiant:La notation utilisée est seulement une variante de cette notation.
(Et oui, il peut y avoir des raisons pour
tar
untar
fichier. Par exemple, Gmail ne vous permet pas d'envoyer un fichier tar ou un fichier tar compressé qui contient un fichier exécutable. Toutefois, si vous incorporez un fichier tar compressé à l'intérieur d'un non-fichier tar compressé, il n'a pas l'air à l'intérieur du fichier pour trouver le fichier exécutable. Je l'utiliser quand j'en ai besoin pour expédier un fichier tar avec un exécutableconfigure
script.)Lorsque vous écrivez
votre shell étend à la chaîne:
(en supposant que 1.gz, 2.gz et 3.gz sont en vous répertoire courant).
tar
pense que vous voulez extraire2.gz
et3.gz
de1.gz
; il ne peut pas trouver ces fichiers dans les archives et qui provoque le message d'erreur.Vous avez besoin d'utiliser la boucle
for
de commandexargs
pour extraire vos fichiers.Qui signifie: exécuter m'
tar -xzf
pour chaquegz
fichier dans le répertoire courant.la raison principale est
tar
prend un seul argument filename. Lorsque vous appeleztar *.tgz
bash s'étend le*
à tous les noms de fichiers avec tgz formants et il devienttar file1 file2 file3
qui n'est pas acceptée partar
. Donc, soit vous utilisez une boucle for commefor i in *.tgz; do tar -zxvf $i ;done
ou l'utilisation d'une autre commande qui exécutetar
comme un effet secondaire, comme indiqué dans les commentaires, estls
oufind . -maxdepth 1 -name \*tgz -exec tar -zxvf {} \;
(ls
de sortie est toujours risqué)