Sıkıştırılmış birçok dosyayı tek bir arşivde nasıl birleştirmeliyim?


10

.tar.xzNeredeyse aynı olan birkaç yüz dosya var (günlük veritabanı dökümleri ve veritabanı yavaş yavaş değişir).

Sıkıştırılmamış dosyalardaki benzerlikler nedeniyle çok iyi sıkıştırılacağına ve küçük ölçekli testlerin bu sıkıştırılmamış dosyaların herhangi bir sayısının sıkıştırılmasının bunlardan sadece biraz daha büyük bir arşiv oluşturduğuna inanıyorum.

Benim sorunum tüm sıkıştırılmamış dosyaları birkaç terabayt (sıkıştırma oranı yaklaşık 25: 1) olacaktır ve bir çalışma alanı olarak kullanmak için o kadar disk alanı yok.

Sıkıştırılmış dosyaları tek tek tek tek arşive ekleyip bir arada sıkıştırmanın faydalarını koruyabilmemin bir yolu var mı?


Bir dosyayı açıp tüm dosyaları belirli bir arşive ekleyip bir sonrakine geçmek için komut dosyasını denemeyi denediniz mi?
darnir

Yanıtlar:


10

Katran dosyaları bir akış biçimi olduğundan - catikisini birlikte oluşturabilir ve neredeyse doğru bir sonuç elde edebilirsiniz - bunu yapmak için onları diske çıkarmanız gerekmez. Dosyaları açabilir (yalnızca), birleştirebilir ve bu akışı yeniden sıkıştırabilirsiniz:

xzcat *.tar.xz | xz -c > combined.tar.xz

combined.tar.xzbileşen tarball'larındaki tüm dosyaların sadece biraz bozuk olan sıkıştırılmış bir tarball'ı olacaktır. Çıkarmak için --ignore-zerosseçeneği (GNU'da tar) kullanmanız gerekir, çünkü arşivlerde sonucun ortasında görünecek bir "dosya sonu" işareti bulunur. Bunun dışında her şey doğru bir şekilde çalışacaktır.

GNU tarayrıca --concatenatebirleşik arşivler üretmek için bir modu da destekler . Bu yukarıdaki sınırlamalara sahiptir - --ignore-zerosayıklamak için kullanmalısınız - ancak sıkıştırılmış arşivlerle çalışmaz. Süreç ikamesi kullanarak onu kandırmak için bir şeyler inşa edebilirsiniz, ancak bu bir güçlük ve daha da kırılgan.

Farklı tar dosyalarında bir kereden fazla görünen dosyalar varsa, bu düzgün çalışmaz, ancak ne olursa olsun bu sorunla karşılaşırsınız. Aksi takdirde, bu size istediğinizi verecektir - çıktıyı borulamak, çıktısını xznasıl tarsıkıştırır.


Yalnızca belirli bir taruygulamayla çalışan arşivler sizin amaçlarınız için yeterli değilse, arşive eklemek rarkadaşınızdır:

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

Bu, her seferinde yalnızca bir arşiv çıkarır, bu nedenle çalışma alanı tek bir arşivin içeriğiyle sınırlıdır. Sıkıştırma, son arşivi bir kerede yapmış olmanız gibi akıyor, bu yüzden olabildiğince iyi olacak. Bunu catsürümlerden daha yavaş yapacak çok fazla açma ve yeniden sıkıştırma yapıyorsunuz , ancak ortaya çıkan arşiv herhangi bir özel destek olmadan her yerde çalışacak.

Tam olarak ne istediğinize bağlı olarak, yalnızca sıkıştırılmamış tar dosyalarını bir arşive eklemenin yeterli olabileceğini unutmayın. İçeriklerinin yanı sıra içeriklerini de tam olarak sıkıştırır (neredeyse) ve her dosya için sıkıştırma yükünü azaltır. Bu şuna benzer:

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

Akışta fazladan katran başlıkları olduğu için bu, son sıkıştırılmış boyut açısından biraz daha az verimlidir, ancak tüm dosyaları ayıklamak ve yeniden dosya olarak eklemek için biraz zaman kazandırır. Sonunda combined.tar.xzçok sayıda (sıkıştırılmamış) db-*.tardosya içerir.


Teşekkürler, ikinci seçeneğiniz amacım için doğru görünüyor, ancak son paragrafınızı ayrıntılı olarak açıklayabilir misiniz? Bu neye benziyor?
jl6

@ jl6: Düzenlemeye bakın.
Michael Homer

Üzgünüm, sadece bunu test edebildim. İkinci yönteminiz bana şu hatayı veriyor:tar: Cannot update compressed archives
jl6
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.