GNU/Linux >> Linux Esercitazione >  >> Linux

Concatena più file tar in un unico comando

Questa domanda è piuttosto vecchia, ma vorrei che fosse stato più facile per me trovare prima le seguenti informazioni. Quindi, se qualcun altro si imbatte in questo, divertiti:

Ciò che Jeff descrive sopra è un bug noto in gnu tar (riportato nell'agosto 2008). Solo il primo archivio (quello dopo il -f opzione) viene rimosso il suo segnalino EOF. Se provi a concatenare più di 2 archivi, gli ultimi archivi verranno "nascosti" dietro i marcatori di fine file.

È un bug in tar. Concatena interi archivi, inclusi i blocchi zero finali, quindi per impostazione predefinita la lettura dell'archivio risultante si interrompe dopo la prima concatenazione.

Fonte:https://lists.gnu.org/archive/html/bug-tar/2008-08/msg00002.html (e messaggi successivi)

Considerando l'età del bug, mi chiedo se verrà mai risolto. Dubito che ci sia una massa critica che ne risente.

Il modo migliore per aggirare questo bug potrebbe essere usare il -i opzione, almeno per i file .tar sul tuo file system.

Come sottolinea Jeff tar --concatenate può impiegare molto tempo per raggiungere l'EOF prima di concatenare l'archivio successivo. Quindi, se rimarrai bloccato con un archivio "rotto" che richiede il tar -i opzione per decomprimere, suggerisco quanto segue:

Invece di usare tar --concatenate -f archive1.tar archive2.tar archive3.tar farai probabilmente meglio a correre cat archive2.tar archive3.tar >> archive1.tar o pipe a dd se intendi scrivere su un dispositivo a nastro. Nota anche che questo potrebbe portare a un comportamento imprevisto se i nastri non sono stati azzerati prima (sovra)scrittura di nuovi dati su di essi. Per questo motivo l'approccio che adotterò nella mia applicazione è tar annidato come suggerito nei commenti sotto la domanda.

Il suggerimento di cui sopra si basa sul seguente benchmark di esempio molto piccolo:

time tar --concatenate -vf buffer.100025.tar buffer.100026.tar
  real  65m33.524s
  user  0m7.324s
  sys   2m50.399s

time cat buffer.100027.tar >> buffer.100028.tar
  real  46m34.101s
  user  0m0.853s
  sys   1m46.133s

I file buffer.*.tar hanno tutti una dimensione di 100 GB, il sistema era praticamente inattivo tranne che per ciascuna delle chiamate. La differenza di fuso orario è abbastanza significativa che personalmente considero questo benchmark valido nonostante le dimensioni ridotte del campione, ma sei libero di giudicare e probabilmente è meglio eseguire un benchmark come questo sul tuo hardware.


Questo potrebbe non aiutarti, ma se sei disposto a utilizzare il -i opzione durante l'estrazione dall'archivio finale, allora puoi semplicemente cat i tars insieme. Un file tar termina con un'intestazione piena di valori nulli e altro riempimento nullo fino alla fine del record. Con --concatenate tar deve esaminare tutte le intestazioni per trovare la posizione esatta dell'intestazione finale, in modo da iniziare a sovrascrivere lì.

Se solo cat i tar, hai solo null extra tra le intestazioni. Il -i L'opzione chiede a tar di ignorare questi null tra le intestazioni. Quindi puoi

cat  receiverTar1.tar receivedTar2.tar ... >>alltars.tar
tar -itvf alltars.tar

Inoltre, il tuo tar --concatenate esempio dovrebbe funzionare. Tuttavia, se hai lo stesso file con lo stesso nome in diversi archivi tar, dovrai riscrivere quel file più volte quando estrai tutto dal tar risultante.


Linux
  1. Come dividere l'archivio "tar" di grandi dimensioni in più file di determinate dimensioni

  2. Come comprimere più file in un archivio .xz?

  3. Comando tar di Linux

  4. Comando bsdtar – Legge e scrive file di archivio su nastro

  5. Aggiunta di file ai file tbz

Come scaricare ed estrarre file Tar con un comando

Comando Tar in Linux (crea ed estrai archivi)

Rinomina comando in Linux (rinomina più file)

Comando tar di Linux – Come comprimere file in Linux

Comando TAR Linux e Unix

Guida introduttiva al comando Tar