Aggiungere / aggiornare un file in un archivio tar.gz esistente?


73

C'è un modo per aggiungere / aggiornare un file in un archivio tar.gz? Fondamentalmente, ho un archivio che contiene un file in /data/data/com.myapp.backup/./files/settings.txte vorrei estrarre quel file dall'archivio (già fatto) e rimetterlo nell'archivio una volta che la modifica è stata effettuata. Come posso ottenere questo? È problematico a causa del .nel percorso?


2
+1. Ciò renderebbe il lavoro su OS X così semplice. Attualmente, devo pulire a mano una directory di tutti i file nascosti come .DS_Storee quindi tarare nuovamente la directory.

Risposte:


15

Il formato del file tar è solo una serie di file concatenati insieme ad alcune intestazioni. Non è un lavoro molto complicato dividerlo, mettere i tuoi contenuti e rimetterli insieme. Detto questo, Jander ha descritto come tar come programma non ha le funzioni di utilità per fare questo e ci sono ulteriori complicazioni con la compressione, che deve sia prima che dopo aver apportato una modifica.

Ci sono, tuttavia, strumenti per il lavoro! Esistono almeno due sistemi là fuori che ti permetteranno di eseguire un montaggio loopback di un archivio tar compresso su una cartella, quindi di apportare le modifiche al file system. Al termine, smontare la cartella e l'archivio compresso è pronto per il roll.

L'unica prima opzione sarebbe il progetto archivemount per FUSE . Ecco un tutorial su questo . Probabilmente il tuo sistema ha già FUSE e in caso contrario la tua distribuzione dovrebbe avere un'opzione per esso.

L'altra opzione è tarfs . È più semplice da usare , ma ho sentito che ha qualche problema con la corruzione degli archivi bzip2, quindi potresti provarlo abbastanza accuratamente prima.


1
Uso AVFS , che è confezionato in Ubuntu e Debian. Sai come archivemount e tarfs si confrontano con AVFS?
Gilles 'SO- smetti di essere malvagio'

Onestamente no, anche se sono curioso di esaminare AVFS ora che menzioni l'alternativa. Ho usato sia archivemount che tarfs, ma è stato per un progetto da tempo disattivato e non conosco il loro stato attuale. Da quell'esperienza ho deciso che l'idea era sbagliata concettualmente anche se l'implementazione funzionava perfettamente.
Caleb,

Ho dato un'occhiata a come funziona archivemount. Non modifica il file .tar.gz esistente, ma quando si smonta, rinomina l'originale e al suo posto crea un nuovo file tar. Se stai cercando una buona esperienza utente, è fantastico, ma se stai cercando di evitare di riscrivere l'intero archivio per motivi di efficienza, non ti aiuterà.
Jander

@Jander Questo è per averlo sottolineato. Sono abbastanza sicuro che si applica a tutte le opzioni di montaggio dell'archivio compresso però. Il problema è che le singole parti del file non sono compresse, le intestazioni interne del file generale e tutto è compresso e per fare in modo che gli altri elementi vengano estratti è come gzip previsto deve essere eseguito sull'intero set di dati. Non c'è modo di iniettare qualcosa nel mezzo senza estrarlo e rieseguire la compressione e riscrivere l'intero file di dati. Da qui il mio precedente commento sul fatto che fosse la soluzione sbagliata concettualmente . Gli archivi sono archivi.
Caleb,

43

Per estrarre il tuo file dal tuo archivio, puoi usare tar xzf archive.tar.gz my/path/to/file.txt. Si noti che verranno create anche le directory nel percorso del file. Utilizzare tar t(ad es. tar tzf archive.tar.gz) Per elencare i file nell'archivio.

tarnon supporta l'aggiornamento "sul posto" dei file. Tuttavia, è possibile aggiungere file alla fine di un archivio, anche se hanno lo stesso percorso di un file già presente nell'archivio. In tal caso, entrambe le copie del file saranno nell'archivio e il file aggiunto successivamente avrà la precedenza su quello precedente. Il comando da utilizzare per questo è tar r(o tar uper aggiungere solo file più recenti dell'archivio) è il comando da usare. Il .nel percorso non dovrebbe essere un problema.

C'è un problema, però: non è possibile aggiungere a un archivio compresso. Quindi dovresti fare:

gunzip archive.tar.gz
tar rf archive.tar data/data/com.myapp.backup/./files/settings.txt
gzip archive.tar

Il che probabilmente non è quello che vuoi sentire, dal momento che significa riscrivere l'intero archivio due volte. Se non è un archivio molto grande, potrebbe essere meglio decomprimere il tutto e quindi tararlo nuovamente dopo la modifica. In alternativa, è possibile utilizzare un archivio non compresso.


Questa risposta è corretta solo nella misura in cui riguarda il tarprogramma standard . Tar come formato di file è in realtà molto accessibile. Puoi facilmente scrivere uno script per aggiornare i contenuti da solo, ma ci sono altri strumenti che già lo fanno .
Caleb,

23
Potresti anche farlo in modo Unix:gzip -dc archive.tar.gz | tar -r data/data/com.myapp.backup/./files/settings.txt | gzip >archive_new.tar.gz
Simon Richter,

2
IIRC puoi semplicemente concatenare due file gzip. Il risultato è un file gzip più grande che contiene entrambi i file non compressi concatenati.
FUZxxl

Una volta decompresso il file, non è possibile utilizzare il flag --update?
pietro

@FUZxxl +1 per aver menzionato la concatenazione di gzip
Johan Boulé il

9

Il tar era originariamente pensato per essere usato per i nastri, quindi la "sostituzione" dei file non è proprio nella progettazione. Tuttavia, è possibile utilizzare --delete per eliminare il file dal tar originale e quindi -u per aggiornare il tar e aggiungere nuovamente il file. Potrebbe volerci un po ', poiché tar deve riorganizzare l'archivio internamente.


Benvenuto in StackExchange! La tua risposta contiene solo un suggerimento già fatto in un'altra risposta . Si prega di leggere le altre risposte a una domanda prima di rispondere, per evitare la creazione di duplicati.
JigglyNaga,

1
Ho modificato un po 'la mia risposta. Non credo che l'altra risposta menzioni
cancella

-5

sul mio Linux x86_64 GNU / Linux per eseguire quell'operazione utilizzo semplicemente il seguente comando:

tar cvfpz /path/archive.tar -T list.txt

Questo comando provoca la creazione di un archivio compresso in /pathun elenco di file incluso nel list.txtfile.


6
Ciò sovrascrive un file esistente /path/archive.tar, invece di aggiungere / aggiornare quel file.
Anthon,
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.