Odpowiedzi:
Jeśli naprawdę chcesz je rozpakować równolegle, możesz to zrobić
for i in *zip; do unzip "$i" & done
To jednak uruchomi N procesów dla plików .zip i może być bardzo ciężkie dla twojego systemu. Aby uzyskać bardziej kontrolowane podejście, uruchamiając jednocześnie tylko 10 równoległych procesów, wypróbuj to:
find . -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
Aby kontrolować liczbę uruchomionych równoległych procesów, zmień -Pna cokolwiek chcesz. Jeśli nie chcesz, aby rekursje następowały w podkatalogach, zrób to zamiast tego:
find . -maxdepth 1 -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
Alternatywnie możesz zainstalować GNU równolegle, jak sugeruje @OleTange w komentarzach i uruchomić
parallel unzip ::: *zip
-execlub -execdirzamiast rurowania do xargs. Jest nie tylko łatwiejszy do zrozumienia, ale także mniej podatny na błędy i zużywa mniej zasobów systemowych. find . -name '*.zip' -exec unzip {} ';'(Musisz zacytować średnik).
-exec \;(możesz wstawić średnik, bez cudzysłowu), uruchomi każde polecenie sekwencyjnie. -exec +jest lepsze, ale tutaj nie będzie działać, ponieważ nie tak to unzipdziała.
Polecenie równoległe GNU jest dobrze dostosowane do tego typu rzeczy. Po:
$ sudo apt-get install parallel
Następnie
ls *.zip | parallel unzip
Spowoduje to użycie tyle rdzeni, ile masz, utrzymując każdy rdzeń zajęty rozpakowaniem, dopóki wszystkie nie zostaną zakończone.
echo *.zipzamiast tego, aby zapobiec wykradaniu się aliasu ls w dodatkowych informacjach. Jednak ma to ten sam problem, co odpowiedź @ Guru, psuje nazwy plików zawierające białe znaki.
xargsGNU Parallel nie łamie nazw plików zawierających spację / tab / cytat. Tylko jeśli nazwy plików zawierają nowe linie, będziesz musiał zachować szczególną ostrożność. Na przykład, używając:parallel unzip ::: *.zip
echojest tak samo złe, jak używanie ls. Globbing i pętla while są najbezpieczniejsze.
Jeśli masz wiele .zipplików w folderze i chcesz je zdekompresować, otwórz terminal i przejdź do folderu, używając:
cd <path_to_folder>
Teraz użyj tego polecenia, aby zdekompresować cały .zipplik:
ls *.zip | xargs -n1 unzip
echo *.zipzamiast tego, aby zapobiec lswykradaniu się aliasu w dodatkowych informacjach, jednak to nadal nie rozwiązuje problemu białych znaków.
lsskryptów, ponieważ dane wyjściowe nie są dobrze zdefiniowane między wersjami. Zamiast tego spójrz na odpowiedź @terdon, która rozwiązuje wszystkie problemy tego rozwiązania.
Możesz użyć find z -execpodobnym,
find . -name "*.zip" -exec unzip {} \;
Działa to, jeśli plik ma spację w nazwie.
unzip \*.zip lub unzip '*.zip'
Oczywiste unzip *.zipnie działa, ponieważ powłoka rozwija go unzip foo.zip bar.zip ...i unzipinterpretuje pierwszą nazwę pliku jako plik zip, a kolejne nazwy plików jako pliki do wyodrębnienia z tego pliku zip.
Jednak unzipjest nieco nietypowe wśród poleceń Unix, że robi swoje ekspansje glob. Jeśli *powłoka nie zostanie rozwinięta przez powłokę, rozpakuje ją i zinterpretuje wszystkie wynikowe nazwy plików jako pliki zip do przetworzenia. Więc w tym szczególnym przypadku można uciec bez forpętli xargslub tym podobnych.