Aggiunta di file a file tbz


8

Sto cercando un modo per aggiornare migliaia di file di archivio .tbz, quindi lo farò con uno script di shell. Devo aggiungere un file a ciascuno.

La mia domanda è: c'è un modo più veloce per farlo senza estrarre i contenuti di ciascun tbz, quindi ricomprimerlo con il nuovo file incluso nel tar contenuto? Come sarebbero i comandi?

Grazie


Un'ovvia alternativa è quella di mettere i file compressi in un tarball non compresso. Ma questo cambia il formato dei dati, quindi potrebbe non essere fattibile per te e può essere inefficiente per un gran numero di piccoli file con ridondanza tra di loro.
Ripristina Monica il

Risposte:


12

Sebbene tarpossa aggiungere file a un archivio già esistente, non può essere compresso. Dovrai bunzip2accedere all'archivio compresso, lasciando un tarball standard. È quindi possibile utilizzare tarla capacità di aggiungere file a un archivio esistente e ricomprimerlo con bzip2.

Dal manuale:

 -r      Like -c, but new entries are appended to the archive.  Note that this only
         works on uncompressed archives stored in regular files.  The -f option is
         required.

è vero
Kiwy,

Questo è un metodo, ma non è l'unico metodo. È possibile modificare un flusso bzip2 senza decomprimerlo completamente. Non so se sia possibile farlo in un modo che consenta di aggiungere in modo pulito un archivio tar, ma dhag mostra un metodo parziale.
Gilles 'SO- smetti di essere malvagio' il

10

L'altra risposta è corretta: non è possibile aggiornare correttamente un archivio tar compresso senza decomprimerlo. La documentazione relativa al tar GNU lo suggerisce e il tentativo di aggiornamento fallisce con un messaggio di errore esplicito:

$ tar --concatenate --file=cat.tar.bz2 two.tar.bz2 
tar: Cannot update compressed archives
tar: Error is not recoverable: exiting now

Tuttavia, se dovessi essere interessato a una soluzione sporca che non richiede decompressione, posso fornirne una, in base alle seguenti osservazioni:

  • L'aggiunta di flussi bzip2 mediante catè supportata e produce un flusso bzip2 valido (lo stesso vale per gzip);
  • aggiungere tars usando catnon produce un file tar valido, motivo per cui --concatenateesiste l' opzione, ma possiamo chiedere a tar di far finta che sia valido:

Potrebbe sembrare più intuitivo desiderare o provare a utilizzare cat per concatenare due archivi invece di utilizzare l' --concatenateoperazione; dopo tutto, cat è l'utilità per combinare i file.

Tuttavia, gli archivi tar incorporano un marcatore di fine file che deve essere rimosso se gli archivi concatenati devono essere letti correttamente come un archivio. --concatenaterimuove il marker di fine archivio dall'archivio di destinazione prima di aggiungere ogni nuovo archivio. Se usi cat per combinare gli archivi, il risultato non sarà un archivio in formato tar valido. Se è necessario recuperare i file da un archivio aggiunto all'utilizzo dell'utilità cat, utilizzare l' opzione --ignore-zeros( -i).

Sulla base di questa conoscenza, possiamo fare, ad esempio:

cat {one,two}.tar.bz2 >combined.tar.bz2

Questo risulta, come spiega lo snippet di documentazione sopra, in un file tar non valido, ma utilizzando --ignore-zeros, può ancora essere letto completamente:

## Show contents of `one.tar.bz2'
$ tar tf one.tar.bz2
a
b

## Show contents of `two.tar.bz2'
$ tar tf two.tar.bz2
c

## Show contents of `combined.tar.bz2', bypassing the bad format
$ tar tif combined.tar.bz2
a
b
c

Nota come quanto sopra elenca tutti e tre i file dai due archivi originali, mentre omettendo -i(correttamente) sono elencati solo i file dal primo archivio originale:

$ tar tf combined.tar.bz2 
a
b

Ancora una volta, non è altro che un trucco sporco, ma potrebbe essere utile se controlli i lati di scrittura e lettura e puoi assicurarti che -iverrà utilizzato quando tenti di leggere da file creati in questo modo.


Questo grazie molto interessante per la risposta dettagliata. Purtroppo non ho il controllo del processo che alla fine leggerà questi archivi.
BottleZero,

Questo può essere usato per "nascondere" alcuni file in un archivio in modo che qualcuno che estrae casualmente ottenga solo il contenuto del tarball originale, ma coloro che sanno aggiungere iil comando alla riga di comando vedranno il tutto.
Monty Harder,
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.