Quando scrivi:
tar -xf *.gz
il tar
il comando vede (per esempio):
tar -xf abc.tar.gz def.tar.gz ghi.tar.gz
Questo viene interpretato come una richiesta per estrarre def.tar.gz
e ghi.tar.gz
dall'archivio abc.tar.gz
. Dal momento che i file non sono presenti, viene visualizzato il messaggio di avviso.
In altre parole, tar
opera su un singolo tar
file (possibilmente compresso) alla volta (in una chiamata). Non funziona su più file tar.
Nota che se abc.tar.gz
contiene un file pqr/xyz/important.c
, puoi estrarre solo un file specificando:
tar -xf abc.tar.gz pqr/xyz/important.c
La notazione che hai usato è solo una variante di questa notazione.
(E sì, ci possono essere ragioni per tar
un tar
file. Ad esempio, Gmail non ti consente di spedire un file tar o un file tar compresso con gzip che contiene un file eseguibile. Tuttavia, se incorpori un file tar compresso con gzip all'interno di un file tar non compresso, non cerca all'interno del file interno per trovare il file eseguibile. Lo uso quando devo spedire un file tar con un eseguibile configure
script.)
il motivo principale è tar
accetta un singolo argomento di nome file. Quando chiami tar *.tgz
bash estende il *
a tutti i nomi di file con formante tgz e diventa tar file1 file2 file3
che non è accettato da tar
. Quindi o usi un ciclo for come for i in *.tgz; do tar -zxvf $i ;done
o usa qualche altro comando che esegue tar
come effetto collaterale come mostrato nei commenti, è ls
o find . -maxdepth 1 -name \*tgz -exec tar -zxvf {} \;
(ls
l'output è sempre rischioso)
Quando scrivi
tar -xzf *.gz
la tua shell lo espande nella stringa:
tar -xzf 1.gz 2.gz 3.gz
(supponendo che 1.gz, 2.gz e 3.gz siano nella tua directory corrente).
tar
pensa che tu voglia estrarre 2.gz
e 3.gz
da 1.gz
; non riesce a trovare questi file negli archivi e questo causa il messaggio di errore.
Devi usare il loop for
del comando xargs
per estrarre i tuoi file.
ls *.gz |xargs -n1 tar -xzf
Ciò significa:eseguimi tar -xzf
per ogni gz
-file nella directory corrente.