Jawaban:
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 ke xargs
. 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 cara unzip
kerjanya.
The GNU paralel perintah baik cocok untuk hal semacam ini. Setelah:
$ sudo apt-get install parallel
Kemudian
ls *.zip | parallel unzip
Ini akan menggunakan sebanyak inti yang Anda miliki, menjaga setiap inti sibuk dengan unzip, sampai semuanya selesai.
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 menggunakan ls
. Globbing dan loop sementara adalah yang paling aman.
Jika Anda memiliki banyak .zip
file di folder Anda dan Anda ingin mendekompres semuanya, buka terminal dan buka folder Anda menggunakan:
cd <path_to_folder>
Sekarang gunakan perintah ini untuk mendekompres semua .zip
file Anda :
ls *.zip | xargs -n1 unzip
echo *.zip
sebagai gantinya untuk mencegah kemungkinan ls
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,
find . -name "*.zip" -exec unzip {} \;
Ini akan berfungsi jika file memiliki spasi di namanya.
unzip \*.zip
atau unzip '*.zip'
Jelas unzip *.zip
tidak bekerja, karena shell mengekspansi unzip foo.zip bar.zip ...
dan unzip
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 tanpa for
lingkaran atau xargs
sejenisnya.