Mam ponad 200 .zip
plików w jednym folderze. Nie chcę dekompresować tych jeden po drugim. Chcę wyodrębnić te przy użyciu pojedynczego polecenia lub skryptu. Jak to zrobić.
27
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 doxargs
. 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 tounzip
działa.Polecenie równoległe GNU jest dobrze dostosowane do tego typu rzeczy. Po:
Następnie
Spowoduje to użycie tyle rdzeni, ile masz, utrzymując każdy rdzeń zajęty rozpakowaniem, dopóki wszystkie nie zostaną zakończone.
źródło
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żywaniels
. Globbing i pętla while są najbezpieczniejsze.Możesz użyć następującego polecenia:
Najpierw zmień katalog w terminalu na katalog zawierający pliki .zip:
Następnie uruchom to polecenie, aby rozpakować wszystkie pliki .zip:
źródło
Jeśli masz wiele
.zip
plików w folderze i chcesz je zdekompresować, otwórz terminal i przejdź do folderu, używając:Teraz użyj tego polecenia, aby zdekompresować cały
.zip
plik:źródło
echo *.zip
zamiast tego, aby zapobiecls
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,Działa to, jeśli plik ma spację w nazwie.
źródło
Nieterminowa metoda.
Po prostu wybierz pliki zip, kliknij jeden z nich prawym przyciskiem myszy i wybierz
extract here
. Możesz wybrać wszystkie lub tylko kilka plików zip na raz.źródło
unzip \*.zip
lubunzip '*.zip'
Oczywiste
unzip *.zip
nie działa, ponieważ powłoka rozwija gounzip foo.zip bar.zip ...
iunzip
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 bezfor
pętlixargs
lub tym podobnych.źródło