Ponieważ pliki tar są formatem przesyłania strumieniowego - możesz cat
dwa z nich razem i uzyskać prawie poprawny wynik - nie musisz wcale rozpakowywać ich na dysk, aby to zrobić. Możesz dekompresować (tylko) pliki, połączyć je razem i ponownie skompresować ten strumień:
xzcat *.tar.xz | xz -c > combined.tar.xz
combined.tar.xz
będzie skompresowanym archiwum wszystkich plików w składowych archiwach, które jest tylko nieznacznie uszkodzone. Aby wyodrębnić, będziesz musiał użyć --ignore-zeros
opcji (w GNU tar
), ponieważ archiwa mają znacznik „końca pliku”, który pojawi się w środku wyniku. Poza tym wszystko będzie działać poprawnie.
GNU tar
obsługuje także --concatenate
tryb tworzenia połączonych archiwów. Ma to te same ograniczenia co powyżej - musisz użyć --ignore-zeros
do wypakowania - ale to nie działa ze skompresowanymi archiwami. Możesz zbudować coś, co zmusi go do działania przy użyciu zastępowania procesów, ale jest to kłopotliwe i jeszcze bardziej kruche.
Jeśli istnieją pliki, które pojawiają się więcej niż jeden raz w różnych plikach tar, nie będzie to działać poprawnie, ale mimo to masz problem. W przeciwnym razie da ci to, czego chcesz - przepuszczanie danych wyjściowych xz
jest sposobem tar
kompresji danych wyjściowych.
Jeśli archiwa, które działają tylko z konkretną tar
implementacją, nie są odpowiednie do twoich celów, dołącz do archiwum z r
twoim przyjacielem:
tar cJf combined.tar.xz dummy-file
for x in db-*.tar.xz
do
mkdir tmp
pushd tmp
tar xJf "../$x"
tar rJf ../combined.tar.xz .
popd
rm -r tmp
done
To zawsze wyodrębnia tylko jedno archiwum na raz, więc przestrzeń robocza jest ograniczona do wielkości zawartości pojedynczego archiwum. Kompresja jest przesyłana strumieniowo, tak jak w przypadku, gdybyś utworzył ostateczne archiwum naraz, więc będzie tak dobry, jak mógł być kiedykolwiek. Robisz dużo nadmiaru dekompresji i rekompresji, co spowoduje, że będzie to wolniejsze niż cat
wersje, ale archiwum wynikowe będzie działać w dowolnym miejscu bez specjalnego wsparcia.
Zauważ, że - w zależności od tego, czego dokładnie chcesz - wystarczy samo dodanie nieskompresowanych plików tar do archiwum. Będą kompresować (prawie) dokładnie tak samo, jak ich zawartość w jednym pliku, a to zmniejszy narzut kompresji dla każdego pliku. To wyglądałoby mniej więcej tak:
tar cJf combined.tar.xz dummy-file
for x in db-*.tar.xz
do
xz -dk "$x"
tar rJf combined.tar.xz "${x%.xz}"
rm -f "${x%.xz}"
done
Jest to nieco mniej wydajne pod względem końcowego skompresowanego rozmiaru, ponieważ w strumieniu są dodatkowe nagłówki tar, ale oszczędza trochę czasu na rozpakowywaniu i ponownym dodawaniu wszystkich plików jako plików. Skończyło się na tym, że combined.tar.xz
zawiera wiele (nieskompresowanych) db-*.tar
plików.