it-swarm.it

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

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.txt e vorrei estrarre quel file dall'archivio (già fatto) e reinserirlo nell'archivio una volta che la modifica è stata effettuata. Come posso ottenere questo? È problematico a causa del . nel percorso?

78
Naftuli Kay

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, descritto da Jander come tar come programma non ha le funzioni di utilità per farlo 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 fare un montaggio loopback di un archivio tar compresso su una cartella, quindi apportare le modifiche al file system. Quando hai finito, smonta la cartella e il tuo archivio compresso è pronto per essere lanciato.

La prima opzione sarebbe il progetto archivemount per Fuse . Ecco n tutorial su questo . Il tuo sistema probabilmente 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.

18
Caleb

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

tar non 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 sostituirà quello precedente. Il comando da utilizzare per questo è tar r (o tar u per 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.

48
Jander

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.

9
rleibman