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ń -P
na 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
-exec
lub -execdir
zamiast 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 unzip
dział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 *.zip
zamiast 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.
xargs
GNU 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
echo
jest tak samo złe, jak używanie ls
. Globbing i pętla while są najbezpieczniejsze.
Jeśli masz wiele .zip
plikó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 .zip
plik:
ls *.zip | xargs -n1 unzip
echo *.zip
zamiast tego, aby zapobiec ls
wykradaniu się aliasu w dodatkowych informacjach, jednak to nadal nie rozwiązuje problemu białych znaków.
ls
skryptó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 -exec
podobnym,
find . -name "*.zip" -exec unzip {} \;
Działa to, jeśli plik ma spację w nazwie.
unzip \*.zip
lub unzip '*.zip'
Oczywiste unzip *.zip
nie działa, ponieważ powłoka rozwija go unzip foo.zip bar.zip ...
i unzip
interpretuje pierwszą nazwę pliku jako plik zip, a kolejne nazwy plików jako pliki do wyodrębnienia z tego pliku zip.
Jednak unzip
jest 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 for
pętli xargs
lub tym podobnych.