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 -P
Sie 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
-exec
oder -execdir
anstelle 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 unzip
funktioniert.
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 *.zip
stattdessen 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.
xargs
GNU 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
echo
ist so schlecht wie mit ls
. Globbing und eine while-Schleife sind am sichersten.
Wenn Sie viele .zip
Dateien 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 .zip
Dateien zu dekomprimieren :
ls *.zip | xargs -n1 unzip
echo *.zip
stattdessen zu verwenden, um zu verhindern, dass sich ein möglicher ls
Alias in zusätzliche Informationen einschleicht, das Problem mit den Leerzeichen jedoch immer noch nicht behebt.
ls
Skripten, 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 -exec
like 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 *.zip
funktioniert nicht, da die Shell es erweitert unzip foo.zip bar.zip ...
und unzip
den ersten Dateinamen als Zip-Datei und die folgenden Dateinamen als Dateien interpretiert, die aus dieser Zip-Datei extrahiert werden sollen.
Allerdings unzip
ist 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 for
Schleife oder xargs
dergleichen davonkommen .