Saya memiliki skrip yang mengekstrak file tar.gz ke subdirektori mysubfolder yang ditentukan :
mkdir mysubfolder; tar --extract --file=sourcefile.tar.gz --strip-components=1 --directory=mysubfolder;
Apakah ada cara yang setara untuk melakukan ini dengan file zip?
Jawaban:
Seperti kata Mathias,
unzip
tidak memiliki opsi seperti itu, tetapi skrip bash satu-liner dapat melakukan pekerjaan itu.Masalahnya adalah: pendekatan terbaik tergantung pada tata letak arsip Anda. Sebuah solusi yang mengasumsikan dir level atas tunggal akan gagal total jika konten langsung di root arsip (pikirkan
/a/foo
/b/foo
/foo
dan kekacauan pengupasan/a
dan/b
).Dan kegagalan yang sama terjadi dengan
tar --strip-component
. Tidak ada solusi satu ukuran untuk semua.Jadi, untuk mengupas akar dir, dengan asumsi ada adalah satu (dan hanya satu):
Pastikan saja file / dirs level kedua tidak memiliki nama yang sama dengan induk level atas (misalnya,
/foo/foo
). Tapi/foo/bar/foo
dan/foo/bar/bar
ok. Jika ya, atau Anda hanya ingin aman, Anda bisa menggunakan dir temp untuk ekstraksi:Jika Anda menggunakan Bash, Anda dapat menguji apakah tingkat atas adalah satu dir atau tidak menggunakan:
Berbicara tentang Bash, Anda harus menghidupkan
dotglob
untuk memasukkan file tersembunyi, dan Anda dapat membungkus semuanya dalam satu fungsi yang berguna:Sekarang masukkan itu ke dalam
~/.bashrc
atau~/.profile
Anda dan Anda tidak perlu khawatir lagi. Cukup gunakan sebagai:(pemberitahuan itu akan secara otomatis dibuat
mysubfolder
untuk Anda jika tidak ada)sumber
Saya tidak dapat menemukan opsi seperti itu di halaman manual
unzip
, jadi saya khawatir ini tidak mungkin. :(Namun, (tergantung situasinya) Anda bisa mengatasinya. Misalnya, jika Anda yakin satu-satunya direktori tingkat atas dalam file zip dinamai
foo-
diikuti oleh nomor versi, Anda bisa melakukan sesuatu seperti ini:sumber
rm -rf foo-*
sengaja menambahkan karena itu berpotensi berbahaya. Bagaimana jika sudah ada folder bernamafoo-bar
? Perhatikan bahwa ekstraksi sedang dilakukan di dalam/tmp
folder, yang akan dikosongkan secara otomatis setiap sekarang dan kemudian.&&
: langkah yang diberikan hanya terjadi jika langkah sebelumnya berhasil, sehingga yang terakhir (yangrm
) hanya berjalan jika semua langkah selesai tanpa kesalahan./tmp/some-hardcoded-folder-name
sebagai folder temp, tetapi sebaliknya harus digunakanmktemp
untuk itu: itu menjamin tidak akan ada folder yang ada. Periksa jawaban saya di bawah ini.Anda dapat menggunakan
-j
jalur sampah (jangan membuat direktori). Ini hanya direkomendasikan untuk arsip tingkat tunggal yang agak umum. Arsip dengan struktur direktori multi level akan diratakan - ini bahkan dapat menyebabkan bentrokan nama untuk file untuk diekstraksi.Dari halaman manual unzip:
sumber