Mehrere Dateien gleichzeitig dekomprimieren


27

Ich habe mehr als 200 .zipDateien in einem Ordner. Ich möchte diese nicht einzeln dekomprimieren. Ich möchte diese mit einem einzigen Befehl oder Skript extrahieren. Wie geht das.

Antworten:


38

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

3
Parallelbetrieb ist eine gute Idee, aber ist Festplatten-I / O nicht der größte Engpass?
Paddy Landau

1
@PaddyLandau nicht sicher, müsste ich überprüfen. Dies hängt von der Geschwindigkeit des Dekomprimierungsalgorithmus und der Geschwindigkeit der Festplatte ab, die ich mir vorstelle.
Terdon

Verwenden Sie -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.)
Paddy Landau

@PaddyLandau Der einzige Grund, warum ich Xargs anspreche, ist, die Dinge parallel laufen zu lassen, wie es das OP verlangt. -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.
Terdon

Ich denke, wir haben das OP anders verstanden. Sie haben ihn so gelesen, als wollten Sie es parallel, während ich ihn als einen einzelnen Befehl anstelle mehrerer Befehle verstand. Nun, er hat beide Methoden jetzt :)
Paddy Landau

17

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.


Es ist eine bessere Idee, 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.
Nyuszika7h

1
@ nyuszika7h Im Gegensatz zu 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
Ole Tange

@ nyuszika7h - Dies sind gute Gründe, um sowohl das Aliasing von Standardbefehlen als auch das Einfügen von Leerzeichen in Dateinamen zu vermeiden .
Wayne Conrad

@ Nyuszika7h mit echoist so schlecht wie mit ls. Globbing und eine while-Schleife sind am sichersten.
Terdon

1
@NateEldredge Während diese Chance in der Zeit, als die Systeme nur eine Magnetplatte hatten, größer war, ist diese Chance heutzutage bei RAIDs mit mehreren Spindeln und Flash-Laufwerken geringer. Das Beste ist natürlich, zu messen und zu sehen, wie sich Ihr System verhält. Ich habe kürzlich ein RAID mit 40 Spindeln verwendet, bei dem die optimale Parallelität für E / A-hungrige Prozesse 10 betrug: Es wurde keine 10-fache Beschleunigung erzielt - nur eine 6-fache, aber weniger als 10 Prozesse ergaben weniger als 6-fache.
Ole Tange

12

Sie können den folgenden Befehl verwenden:

Wechseln Sie zuerst im Terminal in ein Verzeichnis mit ZIP-Dateien:

cd /path

Führen Sie dann diesen Befehl aus, um alle ZIP-Dateien zu entpacken:

for z in *.zip; do unzip "$z"; done

10

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

3
Dies schlägt fehl, wenn einer der Dateinamen Leerzeichen enthält.
Terdon

1
Ja du hast Recht.
g_p

Es ist eine bessere Idee, 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.
Nyuszika7h

1
@OleTange Falls du es nicht bemerkt hast, habe ich gesagt, dass es bei Dateinamen mit Leerzeichen immer noch fehlschlägt.
nyuszika7h

1
Verlassen Sie sich niemals auf die Ausgabe von 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.
Paddy Landau

6

Sie können find mit -execlike so verwenden,

find . -name "*.zip" -exec unzip {} \;

Dies wird funktionieren , wenn die Datei ein Leerzeichen im Namen hat.


3

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.


1

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 .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.