GNU/Linux >> Znalost Linux >  >> Linux

Spojte více souborů tar jedním příkazem

Tato otázka je poměrně stará, ale přál bych si, aby pro mě bylo snazší najít následující informace dříve. Takže pokud na to ještě někdo narazí, užijte si to:

To, co Jeff popisuje výše, je známá chyba v gnu tar (nahlášená v srpnu 2008). Pouze první archiv (ten za -f volba) odstraní značku EOF. Pokud se pokusíte zřetězit více než 2 archivy, poslední archivy budou „skryty“ za značkami konce souboru.

Je to chyba v dehtu. Zřetězí celé archivy, včetně koncových nulových bloků, takže ve výchozím nastavení se čtení výsledného archivu zastaví po prvním zřetězení.

Zdroj:https://lists.gnu.org/archive/html/bug-tar/2008-08/msg00002.html (a následující zprávy)

Vzhledem ke stáří chyby jsem zvědavý, jestli bude někdy opravena. Pochybuji, že je ovlivněno kritické množství.

Nejlepším způsobem, jak obejít tuto chybu, by mohlo být použití -i možnost, alespoň pro soubory .tar ve vašem systému souborů.

Jak Jeff zdůrazňuje tar --concatenate může trvat dlouho, než dosáhne EOF, než zřetězí další archiv. Pokud tedy zůstanete u „rozbitého“ archivu, který potřebuje tar -i možnost rozbalit tar, navrhuji následující:

Namísto použití tar --concatenate -f archive1.tar archive2.tar archive3.tar pravděpodobně bude lepší běhat cat archive2.tar archive3.tar >> archive1.tar nebo potrubí na dd pokud máte v úmyslu zapisovat na páskové zařízení. Také si uvědomte, že to může vést k neočekávanému chování, pokud se pásky před (pře)psáním nových dat nevynulovaly. Z tohoto důvodu je přístup, který ve své žádosti použiji, vnořené dehty, jak je navrženo v komentářích pod otázkou.

Výše uvedený návrh je založen na následujícím velmi malém vzorovém benchmarku:

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

Všechny soubory buffer.*.tar mají velikost 100 GB, systém byl téměř nečinný, kromě každého z volání. Časový rozdíl je natolik významný, že osobně považuji tento benchmark za platný i přes malou velikost vzorku, ale můžete se o tom svobodně rozhodnout a pravděpodobně bude nejlepší spustit takový benchmark na svém vlastním hardwaru.


Možná vám to nepomůže, ale pokud jste ochotni použít -i možnost při extrahování z finálního archivu, pak můžete jednoduše cat dehty dohromady. Soubor tar končí záhlavím plným null a více null odsazením až do konce záznamu. S --concatenate tar musí projít všemi záhlavími, aby našel přesnou polohu posledního záhlaví, aby tam mohl začít přepisovat.

Pokud stačí cat dehty, máte mezi záhlavími jen další nuly. -i volba žádá tar, aby ignoroval tyto nuly mezi záhlavími. Takže můžete

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

Také vaše tar --concatenate příklad by měl fungovat. Pokud však máte stejný pojmenovaný soubor v několika archivech tar, budete tento soubor několikrát přepisovat, když vše rozbalíte z výsledného taru.


Linux
  1. Příkaz tar pro Linux

  2. Příkaz bsdtar – Čtení a zápis páskových archivních souborů

  3. Jak mohu zkopírovat více souborů přes scp v jednom příkazu?

  1. Jak vytvořit archiv tar rozdělený do více souborů?

  2. nohup více po sobě jdoucích příkazů

  3. Přidání souboru do souborů TBZ

  1. Jak rozdělit velký archiv „tar“ na více souborů určité velikosti

  2. Zřetězit konkrétní soubory do jednoho jediného souboru?

  3. Jak zkomprimovat více souborů do archivu .xz?