Apakah ada tar atau cpio yang lebih pintar di luar sana untuk secara efisien mengambil file yang disimpan dalam arsip?


24

Saya menggunakan taruntuk mengarsipkan sekelompok file yang sangat besar (multi-GB) bz2.

Jika saya gunakan tar -tf file.taruntuk membuat daftar file dalam arsip, ini membutuhkan waktu yang sangat lama untuk diselesaikan (~ 10-15 menit).

Demikian juga, cpio -t < file.cpiobutuh waktu lama untuk menyelesaikan, plus atau minus beberapa detik.

Karenanya, mengambil file dari arsip (via tar -xf file.tar myFileOfInterest.bz2misalnya) lambat.

Apakah ada metode arsip di luar sana yang menyimpan "katalog" yang tersedia dengan arsip, sehingga file individu dalam arsip dapat diambil dengan cepat?

Sebagai contoh, beberapa jenis katalog yang menyimpan pointer ke byte tertentu dalam arsip, serta ukuran file yang akan diambil (serta rincian khusus sistem file lainnya).

Apakah ada alat (atau argumen ke taratau cpio) yang memungkinkan pengambilan file secara efisien dalam arsip?

Jawaban:


15

tar (dan cpio dan afio dan pax dan program serupa) adalah format berorientasi aliran - mereka dimaksudkan untuk dialirkan langsung ke kaset atau disalurkan ke proses lain. sementara, secara teori, akan mungkin untuk menambahkan indeks di akhir file / stream, saya tidak tahu versi apa pun yang melakukannya (itu akan menjadi perangkat tambahan yang bermanfaat)

itu tidak akan membantu dengan arsip tar atau cpio Anda yang ada, tetapi ada alat lain, dar ("arsip disk"), yang memang membuat file arsip yang berisi indeks seperti itu dan dapat memberi Anda akses langsung cepat ke file individual dalam arsip tersebut .

jika dar tidak disertakan dengan unix / linux-dist Anda, Anda dapat menemukannya di:

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


Apakah ada cara untuk menyalurkan ekstraksi ke output standar? Sepertinya ada cara untuk membuat arsip dari input standar, tetapi bukan cara (setidaknya tidak secara langsung) untuk mengekstrak ke output standar. Tidak jelas dari dokumentasi jika ada cara untuk melakukan ini. Apakah Anda tahu bagaimana ini bisa dicapai?
Alex Reynolds

1
tidak, tidak tahu. Saya sebenarnya tidak menggunakan dar sendiri ... saya hanya tahu itu ada. Saya cukup senang dengan tar, dan cenderung hanya membuat file teks daftar isi untuk file tar besar yang mungkin ingin saya cari nanti. Anda dapat melakukan ini pada saat yang sama dengan membuat arsip tar dengan menggunakan opsi v dua kali (misalnya "tar cvvjf /tmp/foo.tar.bz2 / path / ke / backup> /tmp/foo.txt")
cas


8

Meskipun tidak menyimpan indeks, starkonon lebih cepat daripada tar. Plus itu mendukung nama file yang lebih panjang dan memiliki dukungan yang lebih baik untuk atribut file.

Seperti yang saya yakin Anda sadari, dekompresi file membutuhkan waktu dan kemungkinan akan menjadi faktor dalam kecepatan ekstraksi bahkan jika ada indeks.

Sunting: Anda mungkin juga ingin melihatnya xar. Ini memiliki header XML yang berisi informasi tentang file dalam arsip.

Dari halaman yang dirujuk:

Header XML Xar memungkinkannya berisi metadata sewenang-wenang tentang file yang terkandung dalam arsip. Selain metadata file unix standar seperti ukuran file dan modifikasi serta waktu pembuatannya, xar dapat menyimpan informasi seperti bit file ext2fs dan hfs, flag unix, referensi atribut yang diperluas, informasi Mac OS X Finder, Mac OS Garpu sumber daya X, dan hash data file.


+1 untuk memberi tahu saya tentang alat bunyi yang bermanfaat yang belum pernah saya dengar sebelumnya.
cas

Link starturun ......
Pacerier

5

Thorbjørn Ravn Anderser benar. Tar GNU secara default membuat arsip yang "dapat dicari". Tapi itu tidak menggunakan informasi itu ketika membaca arsip ini jika opsi -n tidak diberikan. Dengan opsi -n, saya baru saja mengekstrak file 7GB dari arsip 300GB dalam waktu yang dibutuhkan untuk membaca / menulis 7GB. Tanpa -n butuh lebih dari satu jam dan tidak menghasilkan apa-apa.

Saya tidak yakin bagaimana kompresi memengaruhi ini. Arsip saya tidak dikompresi. Arsip yang dikompresi tidak dapat "dicari" karena saat ini (1.26) GNU melepas kompresi ke program eksternal.


menurut halaman manual tar man7.org/linux/man-pages/man1/tar.1.html , tar GNU secara default akan menggunakan format yang dapat dicari saat menulis, dan jika arsip dapat dicari, akan menggunakannya saat membaca (untuk daftar atau ekstrak). Jika Anda menggunakan tar GNU dan masih melihat masalah, Anda harus mengajukan laporan bug dengan GNU.
Brian Minton

7
Jika saya membaca manual dengan benar, itu tidak pernah mengatakan itu memiliki semacam indeks dan dapat melompat ke file apa pun dalam arsip yang diberikan nama file. --seek berarti media yang mendasarinya dapat dicari, sehingga ketika ia membaca dari awal, ia dapat melewatkan membaca isi file, tetapi masih perlu membaca header entri dari awal. Yang mengatakan, jika Anda memiliki arsip dengan file 1M, dan Anda mencoba untuk mengekstrak yang terakhir, dengan --no-seek, Anda perlu membaca konten semua file; dengan --seek, Anda hanya perlu membaca header 1M, satu untuk setiap file, tetapi masih sangat lambat.
icando

4

Satu-satunya format arsip yang saya tahu menyimpan indeks adalah ZIP, karena saya harus merekonstruksi indeks yang rusak lebih dari sekali.


2

Itu tidak mengindeks yang saya tahu, tapi saya menggunakan dump & restore dengan file besar, dan menavigasi pohon pemulihan dalam mode interaktif untuk memilih file acak SANGAT cepat.


2

Anda dapat menggunakan format arsip / kompresi 7z (7zip) jika Anda memiliki akses ke p7zip-fullpaket.

Di Ubuntu Anda dapat menggunakan perintah ini untuk menginstalnya:

$ sudo apt-get install p7zip-full

Untuk membuat arsip yang dapat Anda gunakan 7z a <archive_name> <file_or_directory>dan jika Anda tidak ingin mengompres file dan hanya ingin "menyimpan" apa adanya, Anda dapat menggunakan -mx0opsi seperti:

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

Creating archive myarchive.7z

Anda kemudian dapat mengekstrak file menggunakan 7z e:

$ 7z e myarchive.7z

Processing archive: myarchive.7z
Extracting  myfile.txt

Atau Anda dapat mendaftar indeks arsip 7z lyang berguna untuk mencari grep:

$ 7z l myarchive.7z | grep

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

Ini juga merupakan topsi untuk menguji integritas, uuntuk menambah / memperbarui file ke arsip, dan duntuk menghapus file.

CATATAN PENTING
Do tidak menggunakan format 7zip untuk linux filesystem backup karena tidak menyimpan pemilik dan kelompok file yang terdapat.


Untuk Linux akan lebih baik untuk 7zip file tar.
Thorbjørn Ravn Andersen

1

Saya percaya GNU tar mampu melakukan apa yang Anda inginkan, tetapi saya tidak dapat menemukan sumber daya definitif mengatakan demikian.

Bagaimanapun Anda membutuhkan format pengarsipan dengan indeks (karena itu akan memungkinkan Anda untuk melakukan apa yang Anda inginkan). Saya tidak percaya file ZIP bisa tumbuh sebesar itu, sayangnya.


File ZIP dapat tumbuh besar .
Pacerier

1
Jika saya membaca manual dengan benar, itu tidak pernah mengatakan itu memiliki semacam indeks dan dapat melompat ke file apa pun dalam arsip yang diberikan nama file. --seek berarti media yang mendasarinya dapat dicari, sehingga ketika ia membaca dari awal, ia dapat melewatkan membaca isi file, tetapi masih perlu membaca header entri dari awal. Yang mengatakan, jika Anda memiliki arsip dengan file 1M, dan Anda mencoba untuk mengekstrak yang terakhir, dengan --no-seek, Anda perlu membaca konten semua file; dengan --seek, Anda hanya perlu membaca header 1M, satu untuk setiap file, tetapi masih sangat lambat.
icando

2
@Pacerier Untuk pemahaman saya format ZIP64 memungkinkan untuk file yang sangat besar, tetapi format ZIP asli tidak.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen, Satu file 4 GB adalah teman besar .
Pacerier

3
@Pacerier 4GB belum besar sejak DVD ISO muncul hampir dua puluh tahun yang lalu. Terrabytes besar saat ini.
oligofren
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.