Antworten:
Wenn Sie sie wirklich parallel dekomprimieren möchten, können Sie dies tun
for i in *zip; do unzip "$i" & done
Dadurch werden jedoch N Prozesse für N .zip-Dateien gestartet, was für Ihr System sehr belastend sein kann. Versuchen Sie für einen kontrollierten Ansatz, bei dem nur 10 parallele Prozesse gleichzeitig gestartet werden, Folgendes:
find . -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
Ändern -PSie die Anzahl der gestarteten parallelen Prozesse nach Ihren Wünschen. Wenn Sie nicht in Unterverzeichnisse wechseln möchten, gehen Sie stattdessen wie folgt vor:
find . -maxdepth 1 -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
Alternativ können Sie GNU parallel installieren, wie von @OleTange in den Kommentaren vorgeschlagen, und ausführen
parallel unzip ::: *zip
-execoder -execdiranstelle von Rohrleitungen zu xargs. Es ist nicht nur einfacher zu verstehen, sondern auch weniger fehleranfällig und verbraucht weniger Systemressourcen. find . -name '*.zip' -exec unzip {} ';'(Sie müssen das Semikolon angeben.)
-exec \;(Sie können das Semikolon umgehen, ohne Anführungszeichen), führt jeden Befehl nacheinander aus. -exec +ist besser, aber es wird hier nicht funktionieren, da es nicht so unzipfunktioniert.
Der GNU-Parallelbefehl ist für diese Art von Dingen gut geeignet. Nach:
$ sudo apt-get install parallel
Dann
ls *.zip | parallel unzip
Dabei werden so viele Kerne verwendet, wie Sie haben, und jeder Kern wird mit einem Entpacken beschäftigt, bis alle erledigt sind.
echo *.zipstattdessen zu verwenden, um zu verhindern, dass ein möglicher ls-Alias zusätzliche Informationen enthält. Dies hat jedoch das gleiche Problem wie @ Gurus Antwort, es bricht bei Dateinamen ab, die Leerzeichen enthalten.
xargsGNU bricht Parallel nicht bei Dateinamen ab, die Leerzeichen / Tabulator / Anführungszeichen enthalten. Nur wenn die Dateinamen Zeilenumbrüche enthalten, müssen Sie besonders vorsichtig sein. Zum Beispiel mit:parallel unzip ::: *.zip
echoist so schlecht wie mit ls. Globbing und eine while-Schleife sind am sichersten.
Wenn Sie viele .zipDateien in Ihrem Ordner haben und alle dekomprimieren möchten, öffnen Sie das Terminal und wechseln Sie in Ihren Ordner mit:
cd <path_to_folder>
Verwenden Sie nun diesen Befehl, um alle Ihre .zipDateien zu dekomprimieren :
ls *.zip | xargs -n1 unzip
echo *.zipstattdessen zu verwenden, um zu verhindern, dass sich ein möglicher lsAlias in zusätzliche Informationen einschleicht, das Problem mit den Leerzeichen jedoch immer noch nicht behebt.
lsSkripten, da die Ausgabe zwischen den Versionen nicht genau definiert ist. Schauen Sie sich stattdessen die Antwort von @terdon an, da diese alle Probleme dieser Lösung löst.
Sie können find mit -execlike so verwenden,
find . -name "*.zip" -exec unzip {} \;
Dies wird funktionieren , wenn die Datei ein Leerzeichen im Namen hat.
unzip \*.zip oder unzip '*.zip'
Das Offensichtliche unzip *.zipfunktioniert nicht, da die Shell es erweitert unzip foo.zip bar.zip ...und unzipden ersten Dateinamen als Zip-Datei und die folgenden Dateinamen als Dateien interpretiert, die aus dieser Zip-Datei extrahiert werden sollen.
Allerdings unzipist ein wenig ungewöhnlich unter Unix - Befehle, dass es seine eigene glob Erweiterungen der Fall ist. Wenn das *von der Shell nicht erweitert wird, wird es entpackt und alle resultierenden Dateinamen werden als zu verarbeitende Zip-Dateien interpretiert. In diesem speziellen Fall kann man also ohne forSchleife oder xargsdergleichen davonkommen .