Rimuovere i file dall'archivio tar


17

Ho un file di grandi dimensioni foo.tar.xzche contiene molti (diciamo 200000) di file. Ho capito che questo archivio contiene alcuni (circa 5000) file che non voglio. Non ho spazio su disco sufficiente per decomprimere tutto sul mio disco; Inoltre, temo che attributi / diritti potrebbero andare persi se lo faccio. Tuttavia, ho abbastanza spazio per ospitare due copie dell'archivio compresso . Esiste uno strumento per rimuovere al volo alcuni dei file dall'archivio (specificato con una regex sul nome del file), ovvero senza decomprimere l'archivio in singoli file?

Risposte:


15

Il tar GNU ha --deleteun'opzione che funziona anche con gli archivi al giorno d'oggi.

Usalo in questo modo, ad esempio:

tar -vf yourArchive.tar --delete your/path/to/delete

Attenzione: molto probabilmente non funzionerà su alcun tipo di supporto magnetico. Ma tarnon ha problemi a lavorare in una pipe, quindi puoi semplicemente usare un file tar temporaneo e sovrascrivere il nastro con quello in seguito. Inoltre non funzionerà su file compressi, quindi è necessario decomprimere il file.

Inoltre, l'operazione sarà piuttosto lenta in ogni caso, a causa della natura lineare impacchettata (per progettazione) degli archivi di catrame.


1
Esiste, ma non funziona con file in cui non è possibile l'accesso casuale (ad es. Comprimere archivi) ma questo è il mio caso d'uso.
FUZxxl

1
L'altro problema è che non riesco a specificare un modello da eliminare. Nota il mio commento del 2013, dove già affronto le carenze di gtar --delete.
FUZxxl,

4
@FUZxxl -Tfunziona con --delete, e --wildcardsti permette di usare motivi piuttosto che nomi di file, quindi crea un file temporaneo contenente i motivi e usa unxz < file.tar.xz | tar --wildcards --delete -T patternfile | xz > file2.tar.xz. Non eseguirà una regex completa (se necessario, basta usare tar -te creare un elenco di nomi di file da eliminare), solo schemi di corrispondenza dei nomi di file.
Casuale 832

14

(modificato, poiché ho frainteso la domanda, che è stata modificata anche da allora)

Il meglio che puoi fare è estrarre, eliminare e ricomprimere l'intero file.

unxz < foobar-old.tar.xz | tar --delete foo/bar | xz > foobar-new.tar.xz

Non è possibile eliminare direttamente i file da un tar.

tar è un flusso, originariamente destinato alle unità a nastro che non eseguono ricerche casuali - mentre in teoria potrebbe essere possibile su un filesystem del disco eseguire un foro / riscrivere il file rimanente, con la compressione il punto è discutibile come la maggior parte se non tutti i metodi di compressione dipendono fortemente dai contenuti verificatisi in precedenza nel file. Per fare ciò, avrai bisogno di una conoscenza molto dettagliata sia del metodo di compressione che del formato del file tar. Questa è complessità fino al punto che nessuno si sarebbe nemmeno preoccupato di farlo. È più economico mantenere i file e ignorarli.

Se hai bisogno di questa funzionalità, tar probabilmente non è quello che vuoi.


Tali file rappresentano il 35% delle dimensioni degli archivi. Le restrizioni che fai notare sembrano valere solo se riscrivo il file, non se lo modifico fuori posto, cosa che posso fare (ho abbastanza spazio per salvare l' archivio compresso due volte). Esiste un tale strumento?
FUZxxl

Potrei aver frainteso la tua domanda allora. Se sei disposto a decomprimere il tar dopo tutto, e reimballarlo, (semplicemente senza effettivamente creare i file tarred - cioè un tar diretto da tar pipe a tar), potrebbe essere possibile.
frostschutz,

Sì, posso farlo. È solo che i file hanno uid / gids / attributi che devo preservare. Inoltre, non ho abbastanza spazio su disco per salvare la rappresentazione scompattata. Tuttavia, ho abbastanza spazio per salvare due archivi pieni.
FUZxxl

1
Non è affatto un problema. Se riesco a farlo in un solo passaggio, il tempo non sarà troppo lungo. Non riesco a immaginare alcun formato di archivio che consenta una rapida eliminazione mentre in realtà rilasci spazio.
FUZxxl

1
--wildcardsaiuto ... Ho dovuto includere ./all'inizio del modello però ...
Gert van den Berg

-4

Secondo il manuale , è possibile passare un elenco di nomi di file per tarestrarre solo quelli. Per esempio:

$ tar --file archive.tar --list
foo
bar
baz

$ tar --file archive.tar --extract foo

Non vedo come - l'estrazione mi aiuti. Potresti elaborare? Tieni presente che non riesco a decomprimere l'archivio (o parti sostanziali di esso) su disco.
FUZxxl

2
Per favore, non solo postare link: questo è un wiki - aggiungi contenuti sufficienti affinché non siano necessari per consentire alle persone di lasciare la pagina per capire la tua risposta.
Jasonwryan,
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.