Buka zip konten file, tetapi tanpa membuat folder arsip

37

Saya memiliki file myarchive.zip yang berisi banyak direktori, file, dll. Katakanlah file myarchive.zip ini hidup di direktori yang disebut "b". Nah, ketika saya menggunakan perintah "unzip myarchive.zip", sistem membuat direktori secara default disebut "myarchive" dengan isi file zip. Saya tidak ingin sistem membuat direktori "myarchive" ini - saya hanya ingin kontennya diekstraksi ke direktori "b". Apakah ini mungkin?

Apa yang saya lakukan sekarang hanyalah mengeluarkan perintah "cp" untuk menyalin file dari direktori yang baru dibuat (dalam hal ini "myarchive" ke "b") ke tempat yang saya inginkan.

ScoobaSteve
sumber
8
Secara default, unziptidak membuat direktori. File zip Anda mungkin memiliki direktori di tingkat atas.
Chris Down
3
Anda bisa menggunakan mvbukan cp. mv archive/* .; rmdir archive/atau serupa.
frostschutz

Jawaban:

45

Versi saya unzipmemiliki -jopsi untuk tidak membuat direktori apa pun.

Begitu

unzip -j /path/to/file.zip

Akan mengekstrak semua file ke direktori saat ini tanpa mengembalikan struktur direktori yang tersimpan dalam zipfile.

Jika Anda hanya ingin menghapus satu tingkat direktori dari arsip, (ekstrak myarchive/dir/filesebagai dir/file, bukan file), Anda dapat menggunakan bsdtar(yang mendukung zipfile selain tarfile) sebagai gantinya dan -sopsinya.

bsdtar -xf /path/to/file.zip -s'|[^/]*/||'
Stéphane Chazelas
sumber
8
Saat menggunakan -jstruktur direktori arsip tidak dibuat ulang dan semua file disimpan dalam folder ekstraksi. Ini berarti SEMUA subfolder dijatuhkan. Jadi jika Anda mau zip/A/f1, zip/A/B/f2dan zip/A/B/C/f3Anda akan berakhir dengan satu folder dengan f1, f2, f3. Menjadi funky jika Anda memiliki file dengan nama yang sama di subfolder yang berbeda. Biasanya Anda hanya ingin meletakkan folder teratas bukan seluruh struktur direktori.
Cristian Vrabie
3
@CristianVrabie, yah itulah yang saya katakan dalam jawabannya. Saya telah menambahkan alternatif bsdtar untuk apa yang Anda minta. Lihat edit.
Stéphane Chazelas
3

Sepertinya ini sangat sederhana dengan bsdtar :

bsdtar --strip-components=1 -xvf file.zip

ismail
sumber
1

Apa jawaban yang diterima tidak menentukan cara melakukannya, seperti yang Anda katakan dalam pertanyaan, jika Anda masih ingin mengekstrak ke folder tertentu tanpa menggunakan jalur folder yang disimpan dalam file zip, Anda dapat menggunakan -jopsi dengan -dopsi dengan cara ini :

unzip -j /path/to/file.zip -d other_folder

atau untuk kasus Anda

unzip -j myarchive.zip -d b
Eduard Florinescu
sumber
2
Anda benar bahwa Anda dapat melakukan itu; tetapi itu tidak akan membuat subdirektori sehingga Anda masih harus memasukkan langkah lain; Saya cukup yakin OP ingin mengganti nama direktori root dari arsip ke nama lain tetapi menjaga struktur yang tersisa di bawah direktori itu.
Pryftan
-1

Jika berkinerja unzip myarchive.zipmenghasilkan direktori myarchivedengan semua yang ada di dalamnya, maka itu berarti pencipta file zip benar-benar melakukan zip pada direktori itu.

Satu-satunya cara untuk membuat apa yang Anda inginkan adalah memindahkan semua konten di luar direktori setelah Anda melakukan unzip:

[user@host]:some/path/b$ unzip myarchive.zip

[user@host]:some/path/b$ ls{ menunjukkan direktorimyarchive }

[user@host]:some/path/b$ mv myarchive/* .

[user@host]:some/path/b$ rm -R myarchive

[user@host]:some/path/b$ ls{ menunjukkan tingkat pertama myarchive (langsung masuk b) }

toinetoine
sumber
1
Anda juga perlu mv myarchive/.* .memindahkan semua file yang tersembunyi seperti .gitignore dan .htaccess.
Kinjal Dixit
1
@ KinjalDixit Itu adalah pemikiran saya juga; Antoine ada kesalahan fatal dalam contoh Anda seperti yang ditunjukkan Kinjai: karena Anda menggunakan rm -Rdan karena Anda tidak menggunakan ls -aAnda tidak menunjukkan jika ada file titik; sekarang apa yang terjadi ketika Anda menjalankan rm -Rdan ada file dot? Anda belum menyalinnya sehingga hilang. Anda benar-benar harus memperbaikinya dan mungkin menjelaskan perbedaannya karena itu adalah sesuatu yang akan menjebak pemula cukup banyak; dan pertimbangkan ini: bagaimana jika itu bukan arsip yang mereka miliki? Atau bagaimana jika mereka menambah perintah untuk menghapus arsip setelah itu tidak dikompresi?
Pryftan
Otoh rmdirakan memastikan itu kosong dulu ... Tetapi jika pengguna tidak tahu tentang file dot itu akan membingungkan mereka.
Pryftan