Cara mengekstrak file tertentu dari tar.gz


106

Bagaimana kita bisa mengekstrak file tertentu dari file tar.gz besar? Saya menemukan proses mengekstraksi file dari tar dalam pertanyaan ini tetapi, ketika saya mencoba perintah yang disebutkan di sana, saya mendapatkan kesalahan:

$ tar --extract --file={test.tar.gz} {extract11}
tar: {test.tar.gz}: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now

Bagaimana cara mengekstrak file tar.gz?


Perhatikan bahwa solusi apa pun harus terlebih dahulu mendekompresi seluruh arsip: superuser.com/questions/655739/... Jika Anda ingin menghindarinya, Anda harus menggunakan format lain, seperti zip. ZIP akan memberikan kompresi lebih sedikit, karena kompres file individual secara terpisah: superuser.com/questions/1013309/... Saya ingin tahu apakah ada format yang mendukung kecepatan dan kemampuan untuk mengekstrak satu file.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:


120

Anda juga bisa menggunakan tar -zxvf <tar filename> <file you want to extract>

Anda harus menulis nama file dengan tepat seperti yang tar ztf test.tar.gzditunjukkan. Jika dikatakan misalnya ./extract11, atau some/bunch/of/dirs/extract11, itulah yang harus Anda berikan (dan file tersebut akan muncul tepat di bawah nama itu, direktori yang diperlukan dibuat secara otomatis).

  • -x: menginstruksikan tar untuk mengekstrak file.
  • -f: menentukan nama file / nama tarball.
  • -v: Verbose (tampilkan kemajuan saat mengekstraksi file).
  • -z: filter arsip melalui gzip, gunakan untuk mendekompresi file .gz.

$ tar -zxvf test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha

1
lalu coba ini tar tf archive.tar.gz | grep extract11. Silakan periksa apakah extract11 ada di arsip atau tidak
harish.venkat

8
Anda harus menulis nama file dengan tepat seperti yang tar ztf test.tar.gzditunjukkan. Jika dikatakan misalnya ./extract11, atau some/bunch/of/dirs/extract11, itulah yang harus Anda berikan (dan file tersebut akan muncul tepat di bawah nama itu, direktori yang diperlukan dibuat secara otomatis).
vonbrand

Saya ingin menambahkan poin di sini, -zopsi ini tidak berfungsi di beberapa versi unix seperti HP-UX.
Ankit Vashistha

1
@ pj-brunet: Tidak, ftidak boleh di akhir. Tetapi harus langsung diikuti dengan nama file. Contoh ini dengan semua pilihan lain setelah nama tar bekerja dengan baik: tar -f mytar.tar.gz -zxv dir/somefile. Itu mengekstrak "dir / somefile" dari "mytar.tar.gz".
mivk

34

Mari kita asumsikan Anda memiliki tarball yang dipanggil lotsofdata.tar.gzdan Anda hanya tahu ada satu file di sana yang Anda inginkan tetapi yang dapat Anda ingat hanyalah bahwa namanya berisi kata tersebut contract. Anda memiliki dua opsi:

Baik gunakan tardan grepuntuk daftar isi tarball Anda sehingga Anda bisa mengetahui path lengkap dan nama file apa pun yang cocok dengan bagian yang Anda tahu, dan kemudian gunakan taruntuk mengekstrak satu file itu sekarang Anda tahu detail pastinya, atau Anda bisa menggunakan dua sedikit saklar yang dikenal untuk mengekstrak semua file yang cocok dengan sedikit yang Anda ketahui tentang nama file Anda — Anda tidak perlu tahu nama lengkap atau bagian mana pun dari jalurnya untuk opsi ini. Rinciannya adalah:

Pilihan 1

$ tar -tzf lotsofdata.tar.gz | grep contract

Ini akan mencantumkan detail semua file yang namanya berisi bagian Anda yang diketahui. Kemudian Anda mengekstrak apa yang ingin Anda gunakan:

$ tar -xzf lotsofdata.tar.gz <full path and filename from your list above>

Anda mungkin perlu ./di depan jalan Anda agar bisa berfungsi.

pilihan 2

$ tar -xzf lotsofdata.tar.gz --wildcards --no-anchored '*contract*'

Terserah Anda yang menurut Anda lebih mudah atau paling berguna.


Drat. Kesalahan ketik pada perintah terakhir: Saya menduplikasi -xzf. Seharusnya hanya ada satu instance dari switch itu.
Wendy Cricks

tar -xzf lotsofdata.tar.gz <full path and filename from your list above>bekerja untuk saya tanpa memberi ./pada awal path lengkap
user13107

Anda mungkin harus bersabar dengan ini, butuh waktu ... Juga mungkin sudah jelas, tetapi itu akan mengekstrak struktur direktori lengkap di direktori saat ini, bahkan jika direktori tersebut belum ada.
PJ Brunet

Tar BSD (setidaknya pada macOS) tidak mendukung --wildcardsopsi. Saya masih bisa mendapatkan perilaku serupa -x -O *foo. *fooadalah nama file glob dalam kasus saya, karena saya tahu file berakhir dengan foo.
Eric Hu

6

Saya mencoba mengekstrak beberapa ratus file dari tarball dengan ribuan file tempo hari. File yang saya butuhkan tidak dapat dirujuk oleh satu wildcard. Jadi saya mencari di Google dan menemukan halaman ini.

Namun, tidak ada trik di atas yang tampak bagus untuk tugas saya. Saya akhirnya membaca pria itu, dan menemukan opsi ini --files-from, jadi solusi terakhir saya adalah

gunzip < thousands.tar.gz | tar -x -v --files-from hundreds.list -f -

dan itu bekerja seperti pesona.

Pembaruan: File daftar harus memiliki format yang sama seperti yang Anda lihat tar -tvf, jika tidak, Anda tidak akan dapat mengekstrak file apa pun.


2

Contoh Anda cocok untuk saya jika Anda tidak menggunakan kawat gigi

$ tar --extract --file=test.tar.gz extract11

Jika ekstrak file Anda11 dalam subfolder, Anda harus menentukan lintasan di dalam tarball.

$ tar --extract --file=test.tar.gz subfolder/extract11

$ tar --extract --file=test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha

Maka dengan sungguh-sungguh extract11 tidak ada dalam file tar. Pastikan Anda perlu menyediakan jalur relatif. Lihat hasil edit
Bernhard

1

Silakan temukan di bawah ini contoh mengekstraksi file tertentu dari file tar.gz.

Dari file lokal:

$ tar xvf file.tgz path/README.txt 2nd_file.txt

Dari URL jarak jauh:

$ curl -s http://example.com/file.tgz | tar xvf - path/README.txt 2nd_file.txt
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.