Aynı anda birden fazla dosyayı açma


27

.zipBir klasörde 200'den fazla dosya var. Bunları tek tek açmak istemiyorum. Bunları tek bir komut veya komut dosyası kullanarak çıkarmak istiyorum. Bu nasıl yapılır.

Yanıtlar:


38

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

3
Paralel olarak çalışmak iyi bir fikirdir, ancak disk G / Ç en büyük darboğaz olmaz mı?
Paddy Landau

1
@PaddyLandau emin değilim, kontrol etmek zorunda kalacağım. Bu, dekompresyon algoritmasının hızına ve hayal ettiğim diskin hızına bağlı olacak.
terdon

Boruları kullanın -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.)
Paddy Landau

@PaddyLandau, xargs'a boru kullanmamın tek nedeni OP'nin istediği gibi işleri paralel olarak yapmak. -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.
terdon

OP'yi farklı bir şekilde anladığımızı düşünüyorum. Onu paralel olarak istediğiniz gibi okuyorsunuz, ben de onu birden çok komut yerine tek bir komut olarak anladım. Eh, şimdi iki yöntemi de var :)
Paddy Landau

17

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.


Bunun 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.
nyuszika7h

1
@ aksine nyuszika7h 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
Ole Tange,

@ nyuszika7h - Bu önlemek için iyi nedenler vardır hem de standart komutları aliasing, ve dosya isimleri koyarak boşluk.
Wayne Conrad,

@ nyuszika7h kullanarak kullanmak echokadar kötü ls. Globbing ve bir süre döngü en güvenli olanıdır.
terdon

1
@NateEldredge Sistemlerin yalnızca bir manyetik diske sahip olduğu zamanlarda bu şans daha da artarken, bugünlerde birden fazla iğ ve RAID'leri olan ve şansı daha küçük olan flash diskler vardı. Yapılacak en iyi şey elbette , sisteminizin nasıl davrandığını ölçmek ve görmek . Geçenlerde G / Ç aç işlemleri için en uygun paralelliğin 10 olduğu 40 iğ RAID kullandım: 10x hızlanmadı - sadece 6x, ancak 10'dan az işlem 6x'ten daha az verdi.
Ole Tange

12

Aşağıdaki komutu kullanabilirsiniz:

İlk önce dizindeki dizini .zip dosyalarını içeren dizine değiştirin:

cd /path

Ardından tüm .zip dosyalarını açmak için bu komutu çalıştırın:

for z in *.zip; do unzip "$z"; done

10

.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

3
Dosya adlarından biri boşluk içeriyorsa, bu başarısız olur.
terdon

1
Evet haklısın.
g_p

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.
nyuszika7h

1
@OleTange Fark etmediyseniz, dosya adlarında hala boşluk bulunan dosya adlarında başarısız olduğunu söyledim.
nyuszika7h

1
Çıktı 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ü.
Paddy Landau

6

Ile bulmak -execgibi kullanabilirsiniz ,

find . -name "*.zip" -exec unzip {} \;

Bu olacak dosya adında bir boşluk varsa çalışır.


3

Terminal olmayan bir yöntem.

Sadece zip dosyalarını seçin, birine sağ tıklayın ve seçin extract here. Bir seferde hepsini veya yalnızca birkaç zip dosyasını seçebilirsiniz.


1

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 .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.