Esiste un tar o cpio più intelligente là fuori per recuperare in modo efficiente un file archiviato nell'archivio?


24

Sto usando tarper archiviare un gruppo di file molto grandi (multi-GB) bz2.

Se uso tar -tf file.tarper elencare i file all'interno dell'archivio, questo richiede molto tempo per il completamento (~ 10-15 minuti).

Allo stesso modo, cpio -t < file.cpiorichiede altrettanto tempo per il completamento, più o meno alcuni secondi.

Di conseguenza, il recupero di un file da un archivio (tramite tar -xf file.tar myFileOfInterest.bz2ad esempio) è altrettanto lento.

Esiste un metodo di archiviazione là fuori che mantiene un "catalogo" facilmente disponibile con l'archivio, in modo che un singolo file all'interno dell'archivio possa essere recuperato rapidamente?

Ad esempio, un tipo di catalogo che memorizza un puntatore a un determinato byte nell'archivio, nonché la dimensione del file da recuperare (nonché qualsiasi altro dettaglio specifico del filesystem).

Esiste uno strumento (o argomento su taro cpio) che consente il recupero efficiente di un file all'interno dell'archivio?

Risposte:


15

tar (e cpio e afio e pax e programmi simili) sono formati orientati allo streaming: sono destinati allo streaming diretto su un nastro o convogliati in un altro processo. mentre, in teoria, sarebbe possibile aggiungere un indice alla fine del file / flusso, non conosco alcuna versione che lo faccia (sarebbe comunque un utile miglioramento)

non aiuterà con gli archivi tar o cpio esistenti, ma esiste un altro strumento, dar ("archivio del disco"), che crea file di archivio che contengono un tale indice e che consente di accedere rapidamente ai singoli file all'interno dell'archivio .

se dar non è incluso con unix / linux-dist, puoi trovarlo su:

http://dar.linux.free.fr/


C'è un modo per convogliare un'estrazione all'output standard? Sembra che ci sia un modo per creare un archivio dall'input standard, ma non un modo (almeno non direttamente) per estrarre l'output standard. Dalla documentazione non è chiaro se esiste un modo per farlo. Sai come questo potrebbe essere realizzato?
Alex Reynolds,

1
no, non lo so. In realtà non uso dar me stesso ... so solo che esiste. sono abbastanza contento di tar e tendo a creare solo file di testo che elencano i contenuti per file tar di grandi dimensioni che potrei voler cercare in seguito. puoi farlo contemporaneamente alla creazione dell'archivio tar usando due volte l'opzione v (es. "tar cvvjf /tmp/foo.tar.bz2 / path / to / backup> /tmp/foo.txt")
cas

10

È possibile utilizzare SquashFS per tali archivi. È

  • progettato per l'accesso mediante un driver per fusibili (sebbene esista un'interfaccia tradizionale)
  • compresso (maggiore è la dimensione del blocco, più efficiente)
  • incluso nel kernel di Linux
  • memorizza UID / GID e tempo di creazione
  • consapevole dell'endianessa, quindi abbastanza portatile

L'unico inconveniente che conosco è che è di sola lettura.

http://squashfs.sourceforge.net/ http://www.tldp.org/HOWTO/SquashFS-HOWTO/whatis.html


8

Sebbene non memorizzi un indice, starsi presume che sia più veloce di tar. Inoltre supporta nomi di file più lunghi e ha un supporto migliore per gli attributi di file.

Come sono sicuro che tu sappia, decomprimere il file richiede tempo e probabilmente sarebbe un fattore nella velocità di estrazione anche se ci fosse un indice.

Modifica: potresti anche dare un'occhiata xar. Ha un'intestazione XML che contiene informazioni sui file nell'archivio.

Dalla pagina di riferimento:

L'intestazione XML di Xar consente di contenere metadati arbitrari sui file contenuti nell'archivio. Oltre ai metadati del file unix standard come la dimensione del file e i suoi tempi di modifica e creazione, xar può memorizzare informazioni come bit di file ext2fs e hfs, flag unix, riferimenti ad attributi estesi, informazioni sul Finder di Mac OS X, Mac OS X fork di risorse e hash dei dati del file.


+1 per avermi avvisato di un utile strumento di risonanza di cui non avevo mai sentito parlare prima.
CAS

Link of staris down ......
Pacerier

5

Thorbjørn Ravn Anderser ha ragione. Tar GNU crea archivi "ricercabili" per impostazione predefinita. Ma non utilizza tali informazioni quando legge questi archivi se l'opzione -n ​​non viene fornita. Con l'opzione -n ​​ho appena estratto il file da 7 GB dall'archivio da 300 GB nel tempo necessario per leggere / scrivere 7 GB. Senza -n ci sono voluti più di un'ora e non ha prodotto risultati.

Non sono sicuro di come la compressione influisca su questo. Il mio archivio non è stato compresso. Gli archivi compressi non sono "ricercabili" perché il tar GNU corrente (1.26) scarica la compressione su un programma esterno.


in base alla pagina man tar man7.org/linux/man-pages/man1/tar.1.html , GNU tar utilizzerà di default il formato ricercabile durante la scrittura e, se l'archivio è ricercabile, lo utilizzerà durante la lettura (per elenco o estratto). Se stai usando GNU tar e stai ancora riscontrando il problema, dovresti presentare una segnalazione bug con GNU.
Brian Minton,

7
Se leggo correttamente il manuale, non dice mai che ha alcun tipo di indice e può saltare a qualsiasi file all'interno dell'archivio dato il nome del file. --seek significa solo che il supporto sottostante è ricercabile, in modo che quando legge dall'inizio, può saltare la lettura del contenuto del file, ma deve ancora leggere le intestazioni delle voci dall'inizio. Detto questo, se hai un archivio con file 1M e cerchi di estrarre l'ultimo, con --no-seek, devi leggere il contenuto di tutti i file; con --seek, devi solo leggere le intestazioni 1M, una per ogni file, ma è ancora super lenta.
Icando,

4

L'unico formato di archivio che conosco che memorizza un indice è ZIP, perché ho dovuto ricostruire gli indici danneggiati più di una volta.


2

Non indicizza ciò che conosco, ma uso dump e ripristino con file di grandi dimensioni e navigare nell'albero di ripristino in modalità interattiva per selezionare file casuali è MOLTO veloce.


2

È possibile utilizzare il formato di archiviazione / compressione 7z (7zip) se si ha accesso al p7zip-fullpacchetto.

Su Ubuntu puoi usare questo comando per installarlo:

$ sudo apt-get install p7zip-full

Per creare un archivio è possibile utilizzare 7z a <archive_name> <file_or_directory>e se non si desidera comprimere i file e si desidera "archiviarli" così come sono, è possibile utilizzare l' -mx0opzione come:

$ 7z a -mx0 myarchive.7z myfile.txt

Creating archive myarchive.7z

È quindi possibile estrarre i file utilizzando 7z e:

$ 7z e myarchive.7z

Processing archive: myarchive.7z
Extracting  myfile.txt

Oppure puoi elencare l'indice dell'archivio con il 7z lquale è utile per la ricerca con grep:

$ 7z l myarchive.7z | grep

2014-07-08 12:13:39 ....A            0            0  myfile.txt

Questa è anche l' topzione per testare l'integrità, uper aggiungere / aggiornare un file nell'archivio ed eliminare un file.

NOTA IMPORTANTE
Do non utilizzare il formato 7zip per i backup del filesystem Linux in quanto non memorizza il proprietario e il gruppo dei file contenuti.


Per Linux andrebbe bene 7zip un file tar.
Thorbjørn Ravn Andersen,

1

Credo che GNU Tar sia in grado di fare quello che vuoi, ma non riesco a trovare una risorsa definitiva che lo dica.

In ogni caso è necessario un formato di archiviazione con un indice (poiché ciò ti consentirà di fare ciò che desideri). Purtroppo non credo che i file ZIP possano crescere così tanto.


I file ZIP possono diventare grandi .
Pacerier

1
Se leggo correttamente il manuale, non dice mai che ha alcun tipo di indice e può saltare a qualsiasi file all'interno dell'archivio dato il nome del file. --seek significa solo che il supporto sottostante è ricercabile, in modo che quando legge dall'inizio, può saltare la lettura del contenuto del file, ma deve ancora leggere le intestazioni delle voci dall'inizio. Detto questo, se hai un archivio con file 1M e cerchi di estrarre l'ultimo, con --no-seek, devi leggere il contenuto di tutti i file; con --seek, devi solo leggere le intestazioni 1M, una per ogni file, ma è ancora super lenta.
Icando,

2
@Pacerier Per quanto ne so, il formato ZIP64 consente file molto grandi, ma il formato ZIP originale no.
Thorbjørn Ravn Andersen,

@ ThorbjørnRavnAndersen, Un singolo file da 4 GB è un grande amico.
Pacerier,

3
@Pacerier 4GB non è stato grande da quando gli ISO del DVD sono entrati in scena quasi venti anni fa. Oggi Terrabytes è grande.
Oligofren,
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.