2013-06-05 7 views
14

Quando uso tar -xzf *.gz per estrarre tutti i file .gz nella directory corrente, viene visualizzato l'errore Not found in archive. Tuttavia, funziona bene se estraggo uno per uno o usa un ciclo for comeErrore 'tar: non trovato nell'archivio' durante l'uso dell'espressione regolare

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

Qual è il motivo di questo errore?

+0

è causato dal fatto che la sintassi argomento tar accetta solo un singolo tar nella riga di comando e il resto viene interpretato come qualcos'altro. Potresti usare anche xargs ('ls * .gz | xargs -n1 tar -xzf' o simili). – ShinTakezou

+0

tar non accetta pattern glob come argomento (cioè non lo interpreterà) afaik – ShinTakezou

+0

@ShinTakezou: ma la shell espanderà la notazione '* .gz'; 'tar' non (di solito) vedrà il' * .gz'. A volte, vuoi estrarre i file con '*' nel nome. Ad esempio: 'tar -xf abc.tar.gz 'src/prog/* nome. *'' Estrarrebbe file come 'src/prog/bigname.c',' src/prog/smallname.h'; le virgolette singole impediscono alla shell di espandere '*' e 'tar' la espande. –

risposta

16

quando si scrive:

tar -xf *.gz 

il comando tar vede (per esempio):

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

Questo viene interpretato come una richiesta di estrarre def.tar.gz e ghi.tar.gz dall'archivio abc.tar.gz. Poiché i file non sono lì, ottieni il messaggio di avviso.

In altre parole, tar funziona su un singolo file tar (eventualmente 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, è possibile estrarre solo quello file specificando:

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

La notazione è stato utilizzato è solo una variante di questa notazione.

(E sì, ci possono essere ragioni per tar un file tar. Ad esempio, Gmail non consente di spedire un file tar o un file tar compresso con gzip che contiene un file che è eseguibile. Tuttavia, se si incorpora un file tar compresso in un file tar non compresso, non cerca all'interno del file interno per trovare il file eseguibile. Lo uso quando ho bisogno di spedire un file tar con uno script eseguibile configure.)

18

Quando scrivi

tar -xzf *.gz 

lo shell lo espande alla stringa:

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

(supponendo che 1.gz, 2.gz e 3.gz siano nella directory corrente).

tar pensa di voler estrarre 2.gz e 3.gz da 1.gz; non riesce a trovare questi file negli archivi e causa il messaggio di errore.

È necessario utilizzare il ciclo for del comando xargs per estrarre i file.

ls *.gz |xargs -n1 tar -xzf 

Ciò significa: correre mi tar -xzf per ogni gz -file nella directory corrente.

3

il motivo principale è tar accetta un singolo argomento nomefile. Quando chiami tar *.tgz bash estende lo * a tutti i nomi di file con tgz formant e diventa tar file1 file2 file3 che non è accettato da tar.Quindi, o si utilizza un ciclo for come for i in *.tgz; do tar -zxvf $i ;done o usare qualche altro comando che esegue tar come effetto collaterale, come mostrato nei commenti, è ls o find . -maxdepth 1 -name \*tgz -exec tar -zxvf {} \; (ls uscita è sempre rischioso)

+0

Perché l'output di ls è sempre rischioso? –

+0

L'output di 'ls' è ambiguo se i nomi contengono uno spazio bianco o una nuova riga. Con i nomi senza spazi bianchi (compresi i non nuovi), va bene, ma non si può fare affidamento su nomi senza spazio in questi giorni. –

+0

@ Jonathan Leffler, sì, lo è! grazie –

Problemi correlati