estrae un singolo file dall'enorme file tgz


19

Ho un enorme file tar (circa 500G) e non voglio estrarre solo un singolo file da esso.
Tuttavia, quando corro tar -xvf file.tgz path/to/filesembra che stia ancora caricando l'intero contenuto in memoria e impiega più di un'ora per estrarre. Ho anche cercato di usare --exclude=ignore.txtdove ignore.txt è un elenco di schemi nel tentativo di impedirgli di attraversare percorsi inutili, ma ciò non sembra funzionare.

Forse non capisco tar ... C'è un modo per estrarre rapidamente il file?


Mi chiedo lo stesso. Il file che sto cercando viene trovato rapidamente ed estratto - e quindi devo aspettare un'ora per l'elaborazione del resto del risultato: o (
maasha

Risposte:


14

Sfortunatamente, per decomprimere un singolo membro .tar.gzdell'archivio devi elaborare l'intero archivio e non puoi fare molto per risolverlo.

Qui è dove .zip(e alcuni altri formati come .rar) gli archivi funzionano molto meglio, perché il zipformato ha una directory centrale di tutti i file in esso contenuti con offset diretti che puntano al centro del zipfile, quindi i membri dell'archivio possono essere rapidamente estratti senza elaborare il tutto.

Potresti chiederti perché l'elaborazione .tar.gzè così lenta?

.tar.gz(spesso abbreviato come .tgz) è semplicemente un .tararchivio compresso con il gzipcompressore. gzipè un compressore in streaming che può funzionare solo con un file. Se vuoi ottenere qualsiasi parte del gzipflusso, devi decomprimerlo nel suo insieme, e questo è ciò che lo uccide davvero per .tar.gz(e per .tar.bz2, .tar.xze altri formati simili basati su .tar).

.taril formato è in realtà molto, molto semplice. È semplicemente un flusso di intestazioni di file o directory a 512 byte (nome, dimensione, ecc.), Ciascuna seguita dal contenuto del file o della directory (riempito con una dimensione di 512 blocchi con 0 byte se necessario). Quando si osserva un blocco 512 totalmente nullo per un'intestazione, questo significa fine .tardell'archivio.

Alcune persone pensano che anche ai .tarmembri dell'archivio non sia possibile accedere rapidamente, ma questo non è del tutto vero. Se l' .tararchivio contiene pochi file di grandi dimensioni, in realtà puoi cercare rapidamente nell'intestazione successiva e quindi puoi trovare il membro di archivio necessario in poche ricerche (ma potresti comunque richiedere tante ricerche quanti sono i membri dell'archivio). Se il tuo .tararchivio contiene molti piccoli file, ciò significa che il recupero rapido dei membri diventa effettivamente impossibile anche per i non compressi .tar.


3
gzip può eseguire lo streaming di dati non compressi, non è necessario annullare tutto. Tuttavia, poiché .tar è l'abbreviazione di tape tape, è necessario attraversare l'intero file fino a trovare il file che si sta cercando. Sebbene tar continuerà a cercare perché potrebbe essercene un altro, in seguito copia più avanti nel file tar.
Kurtm,

9

Se si sta estraendo solo un file da un file di grandi dimensioni tar, si sta utilizzando GNU tar, e si può garantire che il file tar non è mai stato allegato alla allora si può ottenere un significativo incremento delle prestazioni utilizzando --occurrence.

Questa opzione dice a tar di fermarsi non appena trova la prima occorrenza di ogni file che hai richiesto, quindi ad es

tar xf large-backup.tar --occurrence etc/passwd etc/shadow

non eseguirà lo spooling dell'intero tarball dopo aver trovato una copia di ciascuno di essi passwde shadowinvece si fermerà. Se questi file compaiono verso la fine, il guadagno in termini di prestazioni non sarà molto, ma se compaiono anche a metà di un file 500G, risparmierai molto tempo.

Per le persone che utilizzano tarbackup a colpo singolo e non utilizzano unità nastro reali, questa situazione è probabilmente il caso tipico.

Nota che puoi anche passare --occurrence=NUMBERper recuperare la NUMBERth occorrenza di ciascun file, il che aiuta se sai che ci sono più versioni nell'archivio. Per impostazione predefinita, il comportamento è uguale a a NUMBERdi 1.


C'è un modo per creare il tar in modo che un file specifico sia il primo a uscire? in modo che --occurrenceentrerebbe immediatamente nel primo file? Immagino che si tratti di nomi di file, quindi qualcosa chiamato aaaaa.jpg sarebbe uscito prima per esempio?
Jeff,

1
@Jeff: Non proprio. Ciò impedisce semplicemente tardi continuare a cercare nel tarball le versioni più recenti di un file trovato. Invece restituisce, come la pagina man dice the Nth occurrence. Se specifichi un file da estrarre dalla riga di comando e dici che --occurrencetar uscirà non appena avrà trovato quel file, e quindi si fermerà effettivamente al "primo file".
Phogg

1

Sfortunatamente, il formato del file tar non contiene un sommario centralizzato, quindi l'archivio deve essere letto in sequenza per individuare un determinato file. È stato originariamente progettato per sostegni di nastro ( "catrame" deriva dal t ape ar cipollina), che non hanno sostenuto tale operazione in ogni caso.

Quindi, probabilmente dovrai solo aspettare.


1

Quando si ha a che fare con un grande tarball usare:

--fast-readper estrarre solo la prima voce di archivio che corrisponde all'operando del nome file, path/to/filein questo caso, che è sempre comunque unico in tarball

tar -xvf file.tgz --fast-read path/to/file

quanto sopra cercherà fino a quando non trova una corrispondenza e poi esce


1
Volevo capire perché questo è ancora a 0 punti. man tar(GNU tar 1.29) non stampa nemmeno questa opzione. Tuttavia Ubuntu sembra averlo abilitato di default . Leggendo rapidamente, non sono sicuro di cosa --fast-readfaccia diversamente --occurrence. Ma poi --occurrencenon è nemmeno sulla pagina Ubuntu, ma è dentro man tar. Sono --fast-reade --occurrencela stessa cosa forse?
Jeff,

Nessuna di queste opzioni è specificata dallo standard e, come sempre con opzioni non standard, è necessario assicurarsi che l'utilità sul proprio sistema le supporti. L'opzione --occurrences è supportata da GNU tar. L'opzione --fast-read è supportata dalle recenti versioni del tar FreeBSD, impacchettato come bsdtar da Ubuntu. Vedi qui per di più.
phogg,
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.