büyük tgz dosyasından tek dosya ayıkla


19

Büyük bir katran dosyam var (yaklaşık 500G) ve ondan sadece tek bir dosya ayıklamak istemiyorum.
Ancak, çalıştırdığımda tar -xvf file.tgz path/to/filehala tüm içeriği belleğe yüklüyor gibi görünüyor ve ayıklanması bir saatten fazla sürüyor. Ayrıca --exclude=ignore.txt, ignore.txt dosyasının boş yollardan geçmesini engellemek için desen listesi olduğu yerde kullanmaya çalıştım , ancak bu işe yaramıyor gibi görünüyor.

Belki de tar'ı anlamıyorum ... Dosyayı hızlıca çıkarmanın bir yolu var mı?


Ben de aynı şeyi merak ediyorum. Aradığım dosya hızlı bir şekilde bulunur ve çıkarılır - ve sonra geri kalan
işlenmenin

Yanıtlar:


14

Ne yazık ki, .tar.gzarşivin tek bir üyesini açmak için tüm arşivi işlemek zorundasınız ve düzeltmek için yapabileceğiniz çok şey yok.

Bu nerede .zip(ve bazı diğer formatlar gibi .rar) çünkü arşivleri, çok daha iyi çalışması zipbiçimi tüm dosyaların merkezi dizin ortasına işaret doğrudan uzaklıklar içerdiği sahip zipdosyası, bu nedenle arşiv üyeleri hızla şeyi işlemeden çıkarılabilir.

İşlemenin neden .tar.gzbu kadar yavaş olduğunu sorabilirsiniz ?

.tar.gz(genellikle kısaltılır .tgz) sadece .tarkompresör ile gzipsıkıştırılmış arşivdir . gzipsadece bir dosya ile çalışabilen akış kompresörüdür. Eğer herhangi bir bölümünü almak istiyorsanız gzipakışında, bir bütün olarak sıkıştırmayı var ve bu gerçekten bunu öldürür nedir .tar.gz(ve için .tar.bz2, .tar.xzve benzer diğer formatlar dayalı .tar).

.taraslında çok, çok basit. Sadece 512 baytlık dosya veya dizin başlıklarının (ad, boyut vb.) Akışını takiben her biri dosya veya dizin içeriklerini takip eder (gerekirse 0 bayt ile 512 blok boyutuna kadar doldurulur). Bir başlık için tamamen boş 512 blok gözlemlediğinizde, bu .tararşivin sonu anlamına gelir .

Bazı insanlar .tararşiv üyelerine bile hızlı bir şekilde erişilemediğini düşünüyor , ancak bu tam olarak doğru değil . Eğer .tararşiv birkaç büyük dosyaları içeren, aslında hızlı bir şekilde bir sonraki başlığının içine alabilirler ve birkaç istiyor (ama yine de arşiv üyesi var gibi birçok arar olarak gerektirebilir) 'de böylece gerekli arşiv üyesini bulabilirsiniz. Senin Eğer .tararşiv minik dosyaların çok sayıda içerir, bu hızlı üye alımı bile sıkıştırılmamış etkin şekilde imkansız hale gelir .tar.


3
gzip sıkıştırılmamış verileri aktarabilir, her şeyi geri almak zorunda değildir. Ancak, .tar kaset arşivi için kısa olduğundan, aradığınız dosyayı bulana kadar tüm dosyayı taramanız gerekir. Katran başka bir tane olabileceğinden aramaya devam etse de, daha sonra katran dosyasına kopyalayın.
kurtm

9

Büyük bir katran dosyasından sadece bir dosya ayıklanması ediyorsanız, GNU'yu kullanıyorsanız tar, ve tar dosya eklenmiş olmamıştı garanti edemez o zaman kullanarak önemli bir performans artışı elde edebilirsiniz --occurrence.

Bu seçenek, tar'ya, istediğiniz her dosyanın ilk oluşumunu bulur bulmaz durmasını söyler;

tar xf large-backup.tar --occurrence etc/passwd etc/shadow

her birinin bir kopyasını bulduktan sonra tüm tarball'ı biriktirmeyecek passwdve shadowbunun yerine duracaktır. Bu dosyalar sonuna yakın görünürse, performans kazancı çok fazla olmaz, ancak 500G dosyasının yarısında bile görünüyorlarsa çok zaman kazanırsınız.

tarTek çekim yedekleri kullanan ve gerçek teyp sürücüleri kullanmayan insanlar için bu durum muhtemelen tipik bir durumdur.

Ayrıca geçirebilmesi Not --occurrence=NUMBERorada biliyorsanız yardımcı olur her dosyanın SAYI'ıncı oluşumunu almak için vardır arşivde birden sürümleri. Varsayılan olarak, davranış NUMBER1'e eşittir .


Belirli bir dosyayı ilk çıkacak şekilde katran oluşturmanın bir yolu var mı? böylece --occurrenceilk dosyaya hemen başlayacaktır. Dosya isimleriyle ilgili olduğunu tahmin ediyorum, yani aaaaa.jpg adı verilen bir şey ilk olarak ortaya çıkacak mı?
Jeff

1
@ Jeff: Pek değil. Bu sadece tarbulduğu bir dosyanın daha yeni sürümleri için tarball'ı aramaya devam etmeyi önler . Bunun yerine, man sayfasının dediği gibi geri döner the Nth occurrence. Eğer belirtirseniz bir komut satırında ekstresi için dosyayı ve söylemek --occurrencekatran en kısa sürede çıkılacak o zaman o dosya buldum ve böylece gibi etkili bir duracağı "ilk dosyanın."
phogg

2

Büyük bir tarball kullanımı ile uğraşırken:

--fast-readyalnızca path/to/filebu durumda tarball'da her zaman benzersiz olan dosya adı işleneniyle eşleşen ilk arşiv girdisini ayıklamak için

tar -xvf file.tgz --fast-read path/to/file

yukarıdaki bir eşleşme bulana kadar arama yapar ve ardından


1
Bunun neden hala 0 noktada olduğunu anlamak istedim. man tar(GNU tar 1.29) bu seçeneği bile yazdırmaz. Ancak Ubuntu'nun varsayılan olarak etkin olduğu görülüyor . Hızlı okuma --fast-read, farklı olanlardan emin değilim --occurrence. Ama sonra --occurrenceUbuntu sayfasında bile değil, içeride man tar. Are --fast-readve --occurrencemuhtemelen aynı şey?
Jeff

Bu seçeneklerin hiçbiri standart tarafından belirtilmez ve standart olmayan seçeneklerde her zaman olduğu gibi, sisteminizdeki yardımcı programın bunları desteklediğinden emin olunmalıdır. --Occurrences seçeneği GNU katran tarafından desteklenir. --Fast-read seçeneği, Ubuntu tarafından bsdtar olarak paketlenen FreeBSD katranının son sürümleri tarafından desteklenir. Daha fazlası için buraya bakın .
phogg

1

Ne yazık ki, tar dosyası formatı merkezi bir içindekiler tablosu içermediğinden, belirli bir dosyayı bulmak için arşivin sırayla okunması gerekir. Başlangıçta teyp yedeklemeleri için tasarlanmıştır ("katran" t ape ar bu tür bir işlemi herhangi bir durumda desteklemeyecek olan chive'dan .

Yani, muhtemelen beklemeniz gerekecek.

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.