Ekstrak hanya file tertentu dari arsip zip ke direktori yang diberikan

151

Saya perlu mengekstrak satu file dari file ZIP yang saya tahu jalan menuju. Apakah ada perintah seperti berikut:

unzip -d . myarchive.zip path/to/zipped/file.txt

Sayangnya, perintah di atas mengekstrak dan membuat ulang seluruh path ke file di ./path/to/zipped/file.txt. Apakah ada cara bagi saya untuk hanya menarik file ke direktori yang ditentukan?

Naftuli Kay
sumber

Jawaban:

130

Anda dapat mengekstrak hanya teks ke output standar dengan -popsi:

unzip -p myarchive.zip path/to/zipped/file.txt >file.txt

Ini tidak akan mengekstrak metadata (tanggal, izin, ...), hanya konten file. Itulah harga yang harus dibayar untuk kenyamanan tidak harus memindahkan file sesudahnya.

Atau, pasang arsip sebagai direktori dan cukup salin file. Dengan AVFS :

mountavfs
cp -p ~/.avfs"$PWD/myarchive.zip#"/path/to/zipped/file.txt .

Atau dengan sekering-zip :

mkdir myarchive.d
fuse-zip myarchive.zip myarchive.d
cp -p myarchive.d/path/to/zipped/file.txt .
fusermount -u myarchive.d; rmdir myarchive.d
Gilles
sumber
2
@TK Kocheran: Mengapa kamu tidak mengujinya saja? Saya menguji perintah pertama, dan itu berhasil.
pengguna tidak diketahui
1
@TKKocheran: File jar adalah ritsleting, sehingga metode unzip dan fuse-zip jelas akan berfungsi. Metode AVFS juga berfungsi, karena AVFS menebak format berdasarkan nama file dan tahu tentang .jar; jika file Anda diberi nama berbeda, Anda mungkin perlu memberi tahu AVFS untuk menggunakan penangan ritsletingnya, misalnya ~/.avfs$PWD/foo.apk#uzip/META-INF.
Gilles
1
sebenarnya, maksud saya mengekstraksi file JAR / biner dari arsip ZIP. Saya belum memiliki kesempatan untuk mengujinya, dapatkah Anda melihat masalah menggunakan perintah pertama di atas untuk mengekstrak file biner?
Naftuli Kay
2
@TKKocheran: Tidak ada masalah, -pekstrak file apa adanya ( jangan -ckonversi teks).
Gilles
2
Saya pikir jawaban @Myles lebih elegan, karena tidak memerlukan redirection output dan mempertahankan atribut file.
gertvdijk
152
unzip -j "myarchive.zip" "in/archive/file.txt" -d "/path/to/unzip/to"

Masukkan path lengkap untuk file zip, bukan hanya nama file. Pastikan untuk menjaga struktur seperti yang terlihat dari dalam file zip.

Ini akan mengekstrak file tunggal file.txtdi myarchive.zipuntuk /path/to/unzip/to/file.txt.

sMyles
sumber
18
Ini jawaban yang lebih baik.
redburn
1
Itu tidak menangani kasus di mana Anda ingin nama file yang dihasilkan berbeda.
Oleg Vaskevich
6
paramter "-j": jalur sampah. Struktur direktori arsip tidak diciptakan kembali; semua file disimpan dalam direktori ekstraksi (secara default, yang sekarang). parameter "-d": ekstrak file ke exdir
e1i45
1
@OlegVaskevich, pertanyaannya tidak meminta nama file target menjadi berbeda
Tapemaster
Ya aku tahu. Masih terpilih. :)
Oleg Vaskevich
25

Versi lebih sederhana:

unzip ARCHIVE_NAME PATH_OF_FILE_INSIDE_ARCHIVE

Ini akan dibuat ulang PATH_OF_FILE_INSIDE_ARCHIVEdi direktori saat ini tetapi hanya mengekstrak file yang ditentukan.

Untuk membuat daftar semua file dalam arsip Zip:

unzip -l ARCHIVE_NAME
Taukir
sumber
2
Jauh lebih sederhana daripada jawaban yang diterima.
FractalSpace
Memang, bekerja dengan baik dan itu waaaay lebih sederhana
Mahmoud Ali
2

Di macOS , yang secara default menggunakan Info-Zip

Pertama, daftar file untuk menemukan apa yang Anda inginkan

unzip -l my.zip

Kemudian berikan daftar file untuk diekstrak dari arsip

unzip my.zip annoying/path/to/file

Gabungkan dengan -p untuk stdout

unzip -p my.zip annoying/path/to/file >./file
Cameron Lowell Palmer
sumber
1
Saya tidak mengerti mengapa orang downvote tanpa alasan yang jelas. Ini adalah jawaban yang benar (tidak hanya untuk macOS)
FractalSpace
@FractalSpace Jelas tidak, ia melakukan kebalikan dari apa yang diinginkan OP.
Konrad Rudolph
Kuncinya adalah mendapatkan file individual. Output ke stdout dan redirect menggunakan flag -p sepele, tapi saya sudah menambahkannya secara eksplisit
Cameron Lowell Palmer
2

penggunaan sederhana:

unzip zipfile.zip path/inside/zip/file.txt

dan itu akan mengembang file.

$ unzip -l ./../html.zip | grep wp-config

     3328  07-22-2019 15:10   html/wp-config.php

     2898  01-07-2019 23:30   html/wp-config-sample.php

$ unzip ./../html.zip html/wp-config.php

     Archive:  ./../html.zip
     inflating: html/wp-config.php

$ ls -lrth

     total 4.0K
     drwxr-sr-x 2 apache apache 4.0K Jul 26 14:41 html

$ ls -lrth html/*

     total 4.0K
     -rw-rw-rw- 1 apache apache 3.3K Jul 22 15:10 wp-config.php
Cesar Alejandro Bravo Anaya
sumber
Dapat juga menambahkan -d outpathargumen untuk menentukan di mana file dimasukkan.
Efren
Dan -jargumen untuk menghindari jalur terkompresi
Efren