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.