Yanıtlar:
Onları gerçekten paralel olarak açmak istersen, yapabilirsin.
for i in *zip; do unzip "$i" & done
Ancak, N .zip dosyaları için N işlemleri başlatacak ve sisteminizde çok ağır olabilir. Daha kontrollü bir yaklaşım için, bir kerede yalnızca 10 paralel işlem başlatmak için şunu deneyin:
find . -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
Başlatılan paralel işlemlerin sayısını kontrol etmek -Piçin istediğiniz şekilde değiştirin . Alt dizinlere yinelenmek istemiyorsanız, bunun yerine şunu yapın:
find . -maxdepth 1 -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
Alternatif olarak, yorumlarda @OleTange tarafından önerildiği şekilde GNU paralelini kurabilir ve
parallel unzip ::: *zip
-execveya -execdiryerine kullanın xargs. Sadece anlaşılması daha kolay değil, aynı zamanda daha az hataya neden oluyor ve daha az sistem kaynağı kullanıyor. find . -name '*.zip' -exec unzip {} ';'(Yarı kolondan alıntı yapmanız gerekir.)
-exec \;(noktalı virgülden kaçabilirsiniz, tırnak işaretleri gerekmez), her komutu sırayla çalıştırır. -exec +daha iyi ama burada işe yaramaz çünkü bu işe yaramaz unzip.
GNU paralel komut de bu tür bir şey için uygundur. Sonra:
$ sudo apt-get install parallel
Sonra
ls *.zip | parallel unzip
Bu, her çekirdeği bir unzip ile meşgul ederek, hepsi tamamlanıncaya kadar, sahip olduğunuz sayıda çekirdek kullanacaktır.
echo *.zipyerine olası bir takma adın fazladan bilgi gizlice sızmasını önlemek için kullanmak daha iyi bir fikirdir . Bununla birlikte, bu @ Guru'nun cevabıyla aynı soruna sahiptir, beyaz boşluk içeren dosya adlarını kırar.
xargsGNU Parallel'in yok değil uzay / sekme / alıntı içeren dosya adları bölünürler. Yalnızca dosya adları yeni satırlar içeriyorsa, daha fazla özen göstermeniz gerekir. Örneğin, şunları kullanarak:parallel unzip ::: *.zip
echokadar kötü ls. Globbing ve bir süre döngü en güvenli olanıdır.
.zipKlasörünüzde çok sayıda dosya varsa ve hepsini açmak istiyorsanız, ardından terminali açın ve aşağıdakileri kullanarak klasörünüze gidin:
cd <path_to_folder>
Şimdi bu komutu tüm dosyanızı .zipaçmak için kullanın:
ls *.zip | xargs -n1 unzip
echo *.zipOlası bir lstakma adın ilave bilgilerde gizlice gizlenmesini önlemek yerine bunun kullanılması daha iyi bir fikirdir , ancak bu hala boşluk sorununu gidermez.
lssürümleri arasında iyi tanımlanmadığından, komut dosyalarının çıktısına asla bağımlı olma. Bunun yerine, @terdon'un cevabına bakın ve bu çözümün tüm sorunlarını çözdü.
Ile bulmak -execgibi kullanabilirsiniz ,
find . -name "*.zip" -exec unzip {} \;
Bu olacak dosya adında bir boşluk varsa çalışır.
unzip \*.zip veya unzip '*.zip'
Açıkça unzip *.zipçalışmaz, çünkü kabuk onu genişletir unzip foo.zip bar.zip ...ve unzipilk dosya adını zip dosyası olarak yorumlar ve aşağıdaki dosya adlarını bu zip dosyasından çıkarılacak dosyalar olarak yorumlar.
Bununla birlikte, unzipUnix komutları arasında, kendi glob açılımlarını yaptığı sıra dışı bir durumdur. Eğer *kabuk tarafından genişletilmediğinde, unzip yapacak ve zip dosyalarını işlenecek neticesinde ortaya çıkan tüm dosya adlarını intepret. Yani bu özel durumda, kişi bir fordöngü veya xargsbenzeri olmadan kurtulabilir .