Come estrarre file specifici da tar.gz


106

Come possiamo estrarre file specifici da un file tar.gz di grandi dimensioni? Ho trovato il processo di estrazione dei file da un tar in questa domanda ma, quando ho provato lì il comando citato, ho ricevuto l'errore:

$ tar --extract --file={test.tar.gz} {extract11}
tar: {test.tar.gz}: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now

Come estraggo un file da tar.gz?


Nota che qualsiasi soluzione deve prima decomprimere l'intero archivio: superuser.com/questions/655739/… Se vuoi evitarlo, dovrai usare un altro formato, come zip. ZIP darà comunque una compressione minore, poiché comprime separatamente i singoli file: superuser.com/questions/1013309/… Mi chiedo se esiste un formato che supporti sia la velocità che la capacità di estrarre un singolo file.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Risposte:


120

Puoi anche usare tar -zxvf <tar filename> <file you want to extract>

È necessario scrivere il nome del file exacty come tar ztf test.tar.gzmostra. Se dice ad esempio ./extract11, o some/bunch/of/dirs/extract11, è quello che devi dare (e il file apparirà esattamente con quel nome, le directory necessarie vengono create automaticamente).

  • -x: indica a tar di estrarre i file.
  • -f: specifica il nome file / tarball.
  • -v: Dettagliato (mostra i progressi durante l'estrazione dei file).
  • -z: filtra l'archivio tramite gzip, usa per decomprimere i file .gz.

$ tar -zxvf test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha,

1
quindi prova questo tar tf archive.tar.gz | grep extract11. Controlla se extract11 è nell'archivio o no
harish.venkat,

8
È necessario scrivere il nome del file exacty come tar ztf test.tar.gzmostra. Se dice ad esempio ./extract11, o some/bunch/of/dirs/extract11, è quello che devi dare (e il file apparirà esattamente con quel nome, le directory necessarie vengono create automaticamente).
vonbrand,

Vorrei aggiungere un punto qui, l' -zopzione non funziona in alcune versioni di unix come HP-UX.
Ankit Vashistha,

1
@ pj-brunet: No, fnon deve essere alla fine. Ma deve essere seguito direttamente dal nome del file. In questo esempio con tutte le altre opzioni dopo il nome tar funziona bene: tar -f mytar.tar.gz -zxv dir/somefile. Estrae "dir / somefile" da "mytar.tar.gz".
mivk

34

Supponiamo che tu abbia un tarball chiamato lotsofdata.tar.gze sai solo che c'è un file lì dentro che vuoi, ma tutto ciò che puoi ricordare è che il suo nome contiene la parola contract. Hai due opzioni:

Usa tare grepper elencare il contenuto del tuo tarball in modo da poter scoprire il percorso completo e il nome di tutti i file che corrispondono alla parte che conosci, e quindi utilizzare tarper estrarre quel file ora ne conosci i dettagli esatti, oppure puoi usare due opzioni poco conosciute per estrarre solo tutti i file che corrispondono a quel poco che sai del tuo nome di file, non è necessario conoscere il nome completo o parte del suo percorso per questa opzione. I dettagli sono:

opzione 1

$ tar -tzf lotsofdata.tar.gz | grep contract

Questo elencherà i dettagli di tutti i file i cui nomi contengono la tua parte nota. Quindi estrai ciò che vuoi usando:

$ tar -xzf lotsofdata.tar.gz <full path and filename from your list above>

Potresti aver bisogno ./di fronte al tuo percorso perché funzioni.

opzione 2

$ tar -xzf lotsofdata.tar.gz --wildcards --no-anchored '*contract*'

A te che trovi più facile o più utile.


Drat. Un refuso su quell'ultimo comando: ho duplicato -xzf. Dovrebbe esserci solo un'istanza di questi switch.
Wendy Cricks,

tar -xzf lotsofdata.tar.gz <full path and filename from your list above>ha funzionato per me senza dare ./all'inizio del percorso completo
user13107

Potrebbe essere necessario avere pazienza con questi, ci è voluto un po 'di tempo ... Inoltre, forse è ovvio, ma estrarrà l'intera struttura di directory nella directory corrente, anche se quelle directory non esistono ancora.
PJ Brunet,

Il tar BSD (almeno su macOS) non supporta l' --wildcardsopzione. Sono stato ancora in grado di ottenere un comportamento simile con -x -O *foo. *fooera il nome del file glob nel mio caso, poiché sapevo che il file si è concluso con foo.
Eric Hu,

6

Stavo cercando di estrarre duecento file da un tarball con migliaia di file l'altro giorno. I file di cui ho bisogno non possono essere referenziati da un singolo carattere jolly. Quindi ho cercato su Google e ho trovato questa pagina.

Tuttavia, nessuno dei trucchi sopra sembra buono per il mio compito. Ho finito per leggere l'uomo e ho trovato questa opzione --files-from, quindi la mia soluzione finale è

gunzip < thousands.tar.gz | tar -x -v --files-from hundreds.list -f -

e funziona come un fascino.

Aggiornamento: il file dell'elenco dovrebbe avere lo stesso formato che vedresti tar -tvf, altrimenti non saresti in grado di estrarre alcun file.


2

Il tuo esempio funziona per me se ometti le parentesi graffe

$ tar --extract --file=test.tar.gz extract11

Se il file extract11 si trova in una sottocartella, è necessario specificare il percorso all'interno del tarball.

$ tar --extract --file=test.tar.gz subfolder/extract11

$ tar --extract --file=test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha,

Quindi estrarre pericolosamente11 non è nel file tar. Assicurati di dover fornire il percorso relativo. Vedi modifica
Bernhard

1

Di seguito sono riportati gli esempi di estrazione di file specifici dal file tar.gz.

Dal file locale:

$ tar xvf file.tgz path/README.txt 2nd_file.txt

Dall'URL remoto:

$ curl -s http://example.com/file.tgz | tar xvf - path/README.txt 2nd_file.txt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.