Saya memiliki lebih dari 200 .zip
file dalam satu folder. Saya tidak ingin mendekompres satu per satu. Saya ingin mengekstraknya menggunakan perintah atau skrip tunggal. Bagaimana cara melakukannya.
27
Jika Anda benar-benar ingin mengompresnya secara paralel, Anda bisa melakukannya
for i in *zip; do unzip "$i" & done
Namun itu, akan meluncurkan proses N untuk file .zip N dan bisa sangat berat pada sistem Anda. Untuk pendekatan yang lebih terkontrol, meluncurkan hanya 10 proses paralel pada suatu waktu, coba ini:
find . -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
Untuk mengontrol jumlah proses paralel yang diluncurkan, ubah -P
ke apa pun yang Anda inginkan. Jika Anda tidak ingin pengulangan ke subdirektori, lakukan ini sebagai gantinya:
find . -maxdepth 1 -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
Atau, Anda dapat menginstal paralel GNU seperti yang disarankan oleh @OleTange di komentar dan jalankan
parallel unzip ::: *zip
-exec
atau-execdir
bukannya perpipaan kexargs
. Tidak hanya lebih sederhana untuk dipahami, tetapi juga lebih sedikit rawan kesalahan dan menggunakan lebih sedikit sumber daya sistem.find . -name '*.zip' -exec unzip {} ';'
(Anda harus mengutip tanda titik koma.)-exec \;
(Anda dapat menghindari koma, tidak perlu tanda kutip), akan menjalankan setiap perintah secara berurutan.-exec +
lebih baik tetapi tidak akan bekerja di sini karena itu bukan caraunzip
kerjanya.The GNU paralel perintah baik cocok untuk hal semacam ini. Setelah:
Kemudian
Ini akan menggunakan sebanyak inti yang Anda miliki, menjaga setiap inti sibuk dengan unzip, sampai semuanya selesai.
sumber
echo *.zip
sebagai gantinya untuk mencegah kemungkinan alias dari menyelinap dalam info tambahan. Namun, ini memiliki masalah yang sama dengan jawaban @ Guru, itu terpecah pada nama file yang mengandung spasi.xargs
GNU Paralel tidak merusak nama file yang mengandung spasi / tab / kutipan. Hanya jika nama file berisi baris baru Anda harus lebih berhati-hati. Misalnya dengan menggunakan:parallel unzip ::: *.zip
echo
sama buruknya dengan menggunakanls
. Globbing dan loop sementara adalah yang paling aman.Anda dapat menggunakan perintah berikut:
Pertama, ubah direktori di terminal ke direktori yang berisi file .zip:
Kemudian jalankan perintah ini untuk unzip semua file .zip:
sumber
Jika Anda memiliki banyak
.zip
file di folder Anda dan Anda ingin mendekompres semuanya, buka terminal dan buka folder Anda menggunakan:Sekarang gunakan perintah ini untuk mendekompres semua
.zip
file Anda :sumber
echo *.zip
sebagai gantinya untuk mencegah kemungkinanls
alias menyelinap di info tambahan, namun itu masih tidak memperbaiki masalah spasi putih.ls
untuk skrip, karena outputnya tidak didefinisikan dengan baik di antara versi. Alih-alih lihat jawaban dari @terdon karena itu memecahkan semua masalah dari solusi ini.Anda dapat menggunakan find dengan
-exec
seperti itu,Ini akan berfungsi jika file memiliki spasi di namanya.
sumber
Metode non terminal.
Cukup pilih file zip, klik kanan pada salah satu dan pilih
extract here
. Anda dapat memilih semua atau hanya sejumlah file zip sekaligus.sumber
unzip \*.zip
atauunzip '*.zip'
Jelas
unzip *.zip
tidak bekerja, karena shell mengekspansiunzip foo.zip bar.zip ...
danunzip
menafsirkan nama file pertama sebagai file zip, dan nama file berikut sebagai file untuk diekstrak dari file zip itu.Namun,
unzip
agak tidak biasa di antara perintah Unix dalam melakukan ekspansi globnya sendiri. Jika*
tidak diperluas oleh shell, unzip akan melakukannya, dan intepret semua nama file yang dihasilkan sebagai file zip yang akan diproses. Jadi dalam kasus khusus ini, seseorang dapat pergi tanpafor
lingkaran atauxargs
sejenisnya.sumber