Arşivde depolanan bir dosyayı verimli bir şekilde almak için dışarıda daha akıllı bir katran var mı?


24

tarÇok büyük (multi-GB) bz2dosya grubunu arşivlemek için kullanıyorum .

tar -tf file.tarArşivdeki dosyaları listelemek için kullanırsam , bu işlemin tamamlanması çok uzun zaman alıyor (~ 10-15 dakika).

Aynı şekilde, cpio -t < file.cpiotamamlanması sadece uzun, artı veya eksi birkaç saniye sürer.

Buna göre bir dosyayı bir arşivden almak ( tar -xf file.tar myFileOfInterest.bz2örneğin üzerinden ) yavaş.

Arşivdeki hazır bir "katalog" u arşivde tutan, böylece arşiv içindeki ayrı bir dosyanın hızlı bir şekilde alınabilmesini sağlayan bir arşivleme yöntemi var mı?

Örneğin, arşivdeki belirli bir bayt için bir işaretçiyi, aynı zamanda alınacak dosyanın boyutunu (ve diğer tüm dosya sistemine özgü detayları) depolayan bir katalog türü.

(Veya argüman bir araç var mı tarveya cpioarşiv içinde bir dosyanın verimli alınmasını sağlar)?

Yanıtlar:


15

tar (ve cpio ve afio ve pax ve benzeri programlar) akışa yönelik biçimlerdir - doğrudan bir kasete akışa geçirilmeleri veya başka bir işleme aktarılmaları amaçlanmıştır. teoride, dosyanın / akımın sonuna bir dizin eklemek mümkün olurken, bunu yapan herhangi bir sürümü bilmiyorum (yine de yararlı bir geliştirme olurdu)

mevcut tar veya cpio arşivlerinize yardımcı olmaz, ancak böyle bir dizin içeren arşiv dosyaları oluşturan ve arşiv içindeki bireysel dosyalara hızlı bir şekilde doğrudan erişmenizi sağlayan başka bir araç olan dar ("disk arşivi") vardır. .

dar unix / linux-dist'inizde yoksa, onu bulabilirsiniz:

http://dar.linux.free.fr/


Ekstraksiyonu standart çıkışa yönlendirmenin bir yolu var mı? Standart girdiden arşiv oluşturmanın bir yolu var, ancak standart çıktıya çıkarmanın bir yolu (en azından doğrudan değil) gibi görünüyor. Bunu yapmanın bir yolu varsa belgelerde belli değil. Bunun nasıl başarılabileceğini biliyor musun?
Alex Reynolds

1
hayır, bilmiyorum. Aslında kendimi dar kullanmıyorum ... sadece var olduğunu biliyorum. tar ile yeterince mutluyum ve daha sonra aramak isteyebileceğim büyük tar dosyalarının içeriğini listeleyen metin dosyaları oluşturma eğilimindeyim. bunu v seçeneğini iki kez kullanarak tar arşivini oluştururken aynı anda yapabilirsiniz (örneğin, "tar cvvjf /tmp/foo.tar.bz2 / path / to / backup> /tmp/foo.txt")
cas

10

Bu tür arşivler için SquashFS kullanabilirsiniz. Bu

  • sigorta sürücüsü kullanılarak erişilmek üzere tasarlanmış (geleneksel bir arayüz olmasına rağmen)
  • sıkıştırılmış (blok boyutu büyüdükçe, daha verimli)
  • Linux çekirdeğine dahil
  • UID'leri / GID'leri ve oluşturma süresini depolar
  • endianess-farkında, bu nedenle oldukça taşınabilir

Bildiğim tek dezavantajı salt okunur olmasıdır.

http://squashfs.sourceforge.net/ http://www.tldp.org/HOWTO/SquashFS-HOWTO/whatis.html


8

Bir endeks depolamamasına rağmen, stardaha hızlı olduğu iddia edilmektedir tar. Ayrıca, daha uzun dosya adlarını destekler ve dosya öznitelikleri için daha iyi desteği vardır.

Bildiğiniz gibi, dosyanın sıkıştırmasını açmak zaman alır ve bir indeks olsa bile çıkartma hızında bir etken olabilir.

Düzenleme: Ayrıca bakmak isteyebilirsiniz xar. Arşivdeki dosyalar hakkında bilgi içeren bir XML başlığına sahiptir.

Başvuru yapılan sayfadan:

Xar'ın XML başlığı, arşivde yer alan dosyalar hakkında rastgele meta veriler içermesini sağlar. Dosyanın boyutu ve değişiklik ve oluşturma zamanları gibi standart unix dosyası meta verilerine ek olarak, xar ext2fs ve hfs dosya bitleri, unix bayrakları, genişletilmiş özniteliklere referanslar, Mac OS X Finder bilgileri, Mac OS gibi bilgileri depolayabilir X kaynak çatalları ve dosya verilerinin karmaları.


Beni daha önce hiç duymadığım kullanışlı bir sondaj aracına uyarmak için +1.
Cas

Bağlantı star
kesildi

5

Thorbjørn Ravn Anderser haklı. GNU tar, varsayılan olarak "aranabilir" arşivler oluşturur. Ancak -n seçeneği belirtilmemişse bu bilgileri bu arşivleri okurken kullanmaz. -N seçeneği ile 7GB dosyasını, 7GB okumak / yazmak için gereken sürede 300 GB arşivden yeni çıkardım. -N olmadan saatten fazla sürdü ve sonuç üretmedi.

Sıkıştırmanın bunu nasıl etkilediğinden emin değilim. Arşivim sıkıştırılmadı. Sıkıştırılmış arşivler "aranamaz" çünkü şu anki (1.26) GNU katranı harici programlara sıkıştırma yapıyor.


katran adam sayfası göre man7.org/linux/man-pages/man1/tar.1.html arşivi aranabilir ise (için okurken, GNU tar varsayılan kullanım yazma aranabilir formatı ile ve bunu kullanacak olacak listelemek veya çıkarmak (). GNU tar kullanıyorsanız ve hala sorunu görüyorsanız, GNU’ya bir hata raporu vermelisiniz.
Brian Minton

7
Kılavuzu doğru okuduğumda, herhangi bir dizine sahip olduğunu asla söylemez ve dosya adı verilen arşivdeki herhangi bir dosyaya atlayabilir. --seek, sadece altta yatan medyanın aranabilir olduğu anlamına gelir, böylece baştan itibaren okuduğunda, dosya içeriğini okuyabilir, ancak yine de giriş başlıklarını baştan okuması gerekir. Bununla birlikte, 1M dosyaları olan bir arşiviniz varsa ve sonuncusunu --no-seek ile çıkarmaya çalışırsanız, tüm dosyaların içeriğini okumanız gerekir; --seek ile, her dosya için bir tane olmak üzere yalnızca 1M başlıkları okumanız gerekir, ancak yine de oldukça yavaştır.
icando

4

Bir dizini sakladığını bildiğim tek arşiv formatı ZIP, çünkü bozuk dizinleri bir kereden fazla yeniden yapılandırmam gerekti.


2

Bildiğim bir dizin değil, büyük dosyaları içeren dökümü ve geri yüklemeyi kullanıyorum ve rastgele dosyaları seçmek için geri yükleme ağacını etkileşimli modda gezmek çok hızlı.


2

p7zip-fullPakete erişiminiz varsa 7z (7zip) arşiv / sıkıştırma formatını kullanabilirsiniz .

Ubuntu'da bu komutu yüklemek için kullanabilirsiniz:

$ sudo apt-get install p7zip-full

Bir arşiv oluşturmak için kullanabilirsiniz 7z a <archive_name> <file_or_directory>ve dosyaları sıkıştırmak istemiyorsanız ve sadece olduğu gibi "saklamak" istiyorsanız, aşağıdaki -mx0gibi seçenekleri kullanabilirsiniz :

$ 7z a -mx0 myarchive.7z myfile.txt

Creating archive myarchive.7z

Daha sonra dosyaları kullanarak dosyaları çıkarabilirsiniz 7z e:

$ 7z e myarchive.7z

Processing archive: myarchive.7z
Extracting  myfile.txt

Ya da 7z lhangi ile aramak için kullanışlı olan arşivin dizinini listeleyebilirsiniz grep:

$ 7z l myarchive.7z | grep

2014-07-08 12:13:39 ....A            0            0  myfile.txt

Bu ayrıca tbütünlüğü test uetme, arşive dosya ekleme / güncelleme ve dbir dosyayı silme seçeneğidir.

ÖNEMLİ NOT
Do not içerdiği dosyaların kullanıcı ve grup saklamaz olarak linux dosya sistemi yedeklemeler için 7zip biçimini kullanın.


Linux için bir tar dosyasını 7zip ile doldurmak iyi olurdu.
Thorbjørn Ravn Andersen

1

GNU katranının istediğini yapabildiğine inanıyorum, ama bunu söyleyen kesin bir kaynak bulamıyorum.

Her durumda, indeksli bir arşivleme formatına ihtiyacınız vardır (çünkü istediğiniz şeyi yapmanıza izin verir). Ne yazık ki, ZIP dosyalarının bu kadar büyüyebileceğine inanmıyorum.


ZIP dosyaları büyük büyüyebilir .
Pacerier

1
Kılavuzu doğru okuduğumda, herhangi bir dizine sahip olduğunu asla söylemez ve dosya adı verilen arşivdeki herhangi bir dosyaya atlayabilir. --seek, sadece altta yatan medyanın aranabilir olduğu anlamına gelir, böylece baştan itibaren okuduğunda, dosya içeriğini okuyabilir, ancak yine de giriş başlıklarını baştan okuması gerekir. Bununla birlikte, 1M dosyaları olan bir arşiviniz varsa ve sonuncusunu --no-seek ile çıkarmaya çalışırsanız, tüm dosyaların içeriğini okumanız gerekir; --seek ile, her dosya için bir tane olmak üzere yalnızca 1M başlıkları okumanız gerekir, ancak yine de oldukça yavaştır.
icando

2
@Pacerier Anladığım kadarıyla ZIP64 formatı çok büyük dosyalara izin veriyor, fakat orijinal ZIP formatı yok.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen, Tek bir 4 GB'lik dosya büyük dostumdur.
Pacerier

3
@Pacerier 4GB, DVD ISO'lar neredeyse yirmi yıl önce sahneye çıktığından beri büyük değildi. Terrabytes günümüzde büyük.
oligofren
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.