mengekstrak file tunggal dari file tgz besar

19

Saya memiliki file tar besar (sekitar 500G) dan saya tidak ingin mengekstrak hanya satu file darinya.
Namun, ketika saya menjalankannya tar -xvf file.tgz path/to/filesepertinya masih memuat seluruh konten ke dalam memori, dan membutuhkan waktu lebih dari satu jam untuk mengekstrak. Saya juga telah mencoba menggunakan di --exclude=ignore.txtmana ign.txt adalah daftar pola dalam upaya untuk menghentikannya dari melintasi jalur yang sia-sia, tetapi itu sepertinya tidak berhasil.

Mungkin saya tidak mengerti tar ... Apakah ada cara untuk dengan cepat mengekstrak file?

Brian
sumber
Saya bertanya-tanya tentang hal yang sama. File yang saya cari ditemukan dengan cepat dan diekstraksi - dan kemudian saya perlu menunggu satu jam untuk sisa hasil diproses: o (
maasha

Jawaban:

14

Sayangnya, untuk membongkar satu anggota .tar.gzarsip Anda harus memproses seluruh arsip, dan tidak banyak yang dapat Anda lakukan untuk memperbaikinya.

Di sinilah .zip(dan beberapa format lain seperti .rar) arsip bekerja lebih baik, karena zipformat memiliki direktori pusat semua file yang terkandung di dalamnya dengan offset langsung yang menunjuk ke tengah zipfile, sehingga anggota arsip dapat dengan cepat diekstraksi tanpa memproses semuanya.

Anda mungkin bertanya mengapa pemrosesan .tar.gzsangat lambat?

.tar.gz(sering disingkat .tgz) hanya .tararsip yang dikompres dengan gzipkompresor. gzipadalah streaming kompresor yang hanya dapat bekerja dengan satu file. Jika Anda ingin mendapatkan bagian dari gzipaliran, Anda harus membuka kompresi itu secara keseluruhan, dan inilah yang benar-benar membunuhnya untuk .tar.gz(dan untuk .tar.bz2, .tar.xzdan format serupa lainnya berdasarkan .tar).

.tarformat sebenarnya sangat, sangat sederhana. Ini hanya aliran file 512-byte atau header direktori (nama, ukuran, dll), masing-masing diikuti oleh isi file atau direktori (diisi dengan ukuran blok 512 dengan 0 byte jika perlu). Ketika Anda mengamati benar-benar nol blok 512 untuk header, ini berarti akhir .tararsip.

Beberapa orang berpikir bahwa bahkan .taranggota arsip tidak dapat diakses dengan cepat, tetapi ini tidak sepenuhnya benar. Jika .tararsip berisi beberapa file besar, Anda sebenarnya dapat dengan cepat mencari ke tajuk berikutnya, dan dengan demikian Anda dapat menemukan anggota arsip yang diperlukan dalam beberapa upaya (tetapi masih dapat meminta sebanyak yang dicari karena ada anggota arsip). Jika .tararsip Anda berisi banyak file kecil, ini berarti pengambilan anggota dengan cepat menjadi tidak mungkin bahkan untuk yang tidak terkompresi .tar.

mvp
sumber
3
gzip dapat melakukan streaming data yang tidak terkompresi, itu tidak harus membatalkan semuanya. Tapi, karena .tar adalah kependekan dari arsip tape, Anda perlu menelusuri seluruh file sampai Anda menemukan file yang Anda cari. Meskipun tar akan terus mencari karena mungkin ada yang lain, nanti salin nanti di file tar.
kurtm
9

Jika Anda mengekstraksi hanya satu file dari file tar besar, Anda menggunakan GNU tar, dan Anda dapat menjamin bahwa file tar tidak pernah ditambahkan, maka Anda bisa mendapatkan peningkatan kinerja yang signifikan dengan menggunakan --occurrence.

Opsi ini memberitahu tar untuk berhenti segera setelah menemukan kemunculan pertama dari setiap file yang Anda minta, jadi mis

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

tidak akan menggulung seluruh tarball setelah menemukan satu salinan dari masing-masing tarball , passwddan shadowsebaliknya akan berhenti. Jika file-file tersebut muncul menjelang akhir, kenaikan kinerja tidak akan banyak, tetapi jika mereka muncul setengah bahkan melalui file 500G Anda akan menghemat banyak waktu.

Bagi orang-orang yang menggunakan taruntuk backup single shot dan tidak menggunakan tape drive nyata situasi ini mungkin merupakan kasus khas.

Catatan bahwa Anda juga dapat lulus --occurrence=NUMBERuntuk mengambil terjadinya NUMBERth setiap file, yang membantu jika Anda tahu bahwa ada yang beberapa versi dalam arsip. Secara default perilaku ini sama dengan a NUMBERdari 1.

phogg
sumber
Apakah ada cara untuk membuat tar sehingga file tertentu akan menjadi yang pertama keluar? sehingga --occurrenceakan langsung menendang di file pertama? Saya menduga ini tentang nama file, jadi sesuatu yang disebut aaaaa.jpg akan keluar dulu misalnya?
Jeff
1
@ Jeff: Tidak juga. Ini hanya mencegah tardari terus mencari tarball untuk versi yang lebih baru dari file yang telah ditemukan. Sebaliknya ia kembali, seperti halaman manual mengatakan the Nth occurrence,. Jika Anda menentukan satu file untuk mengekstrak pada baris perintah dan Anda katakan --occurrencemaka tar akan keluar segera setelah menemukan file itu, dan dengan demikian secara efektif berhenti di "file pertama."
phogg
1

Sayangnya, format file tar tidak mengandung daftar isi terpusat - sehingga arsip harus dibaca secara berurutan untuk menemukan file tertentu. Awalnya dirancang untuk backup tape ("tar" berasal dari t kera ar chive), yang tidak akan mendukung operasi semacam itu dalam hal apa pun.

Jadi, Anda mungkin harus menunggu.

pengguna55325
sumber
1

Saat berhadapan dengan penggunaan tarball besar:

--fast-readuntuk mengekstrak hanya entri arsip pertama yang cocok dengan operan nama file, path/to/filedalam hal ini - yang selalu unik di tarball

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

di atas akan mencari sampai menemukan kecocokan dan kemudian keluar

ryan
sumber
1
Saya ingin mengerti mengapa ini masih 0 poin. man tar(GNU tar 1.29) bahkan tidak mencetak opsi ini. Namun Ubuntu tampaknya telah mengaktifkannya secara default . Membaca dengan cepat, saya tidak yakin apa --fast-readbedanya --occurrence. Tapi kemudian --occurrencebahkan tidak ada di halaman Ubuntu, tetapi di man tar. Apakah --fast-readdan --occurrencehal yang sama mungkin?
Jeff
Tak satu pun dari opsi ini ditentukan oleh standar dan, seperti biasa dengan opsi non-standar, harus diperhatikan untuk memastikan utilitas pada sistem Anda mendukungnya. Opsi --occurrences didukung oleh tar GNU. Opsi --fast-read didukung oleh versi FreeBSD tar terbaru, dikemas sebagai bsdtar oleh Ubuntu. Lihat di sini untuk lebih lanjut.
phogg