Ich habe mehr als 200 .zip
Dateien in einem Ordner. Ich möchte diese nicht einzeln dekomprimieren. Ich möchte diese mit einem einzigen Befehl oder Skript extrahieren. Wie geht das.
27
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 zuxargs
. 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 sounzip
funktioniert.Der GNU-Parallelbefehl ist für diese Art von Dingen gut geeignet. Nach:
Dann
Dabei werden so viele Kerne verwendet, wie Sie haben, und jeder Kern wird mit einem Entpacken beschäftigt, bis alle erledigt sind.
quelle
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 mitls
. Globbing und eine while-Schleife sind am sichersten.Sie können den folgenden Befehl verwenden:
Wechseln Sie zuerst im Terminal in ein Verzeichnis mit ZIP-Dateien:
Führen Sie dann diesen Befehl aus, um alle ZIP-Dateien zu entpacken:
quelle
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:Verwenden Sie nun diesen Befehl, um alle Ihre
.zip
Dateien zu dekomprimieren :quelle
echo *.zip
stattdessen zu verwenden, um zu verhindern, dass sich ein möglicherls
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,Dies wird funktionieren , wenn die Datei ein Leerzeichen im Namen hat.
quelle
Eine nicht terminale Methode.
Wählen Sie einfach die Zip-Dateien aus, klicken Sie mit der rechten Maustaste auf eine und wählen Sie
extract here
. Sie können alle oder nur eine Reihe von ZIP-Dateien gleichzeitig auswählen.quelle
unzip \*.zip
oderunzip '*.zip'
Das Offensichtliche
unzip *.zip
funktioniert nicht, da die Shell es erweitertunzip foo.zip bar.zip ...
undunzip
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 ohnefor
Schleife oderxargs
dergleichen davonkommen .quelle