it-swarm.com.de

Erstellen Sie einen eigenen Ordner für alle Zip-Dateien in einem Verzeichnis und extrahieren Sie die Zip-Dateien

Wenn ich eine Zip-Datei wähle und mit der rechten Maustaste auf "Hier extrahieren" klicke, wird ein Ordner mit dem Zip-Dateinamen erstellt und der gesamte Inhalt der Zip-Datei wird darin extrahiert.

Ich möchte jedoch mehrere Zip-Dateien über Shell konvertieren. Aber wenn ich das mache

unzip filename.Zip

der Ordner "filename" wird nicht erstellt, aber alle Dateien werden in das aktuelle Verzeichnis extrahiert.

Ich habe mir die Parameter angesehen, aber es gibt keinen solchen Parameter. Ich habe es auch versucht

for zipfile in \*.Zip; do mkdir $zipfile; unzip $zipfile -d $zipfile/; done

aber die .Zip Erweiterung von 2. $ zipfile und 4. $ zipfile muss mit sed entfernt werden. Wenn ich mache

for zipfile in \*.Zip; do mkdir sed 's/\.Zip//i' $zipfile; unzip $zipfile -d sed 's/\.Zip//i' $zipfile/; done 

es funktioniert nicht.

Wie ersetze ich das .Zip Erweiterung von $zipfile richtig?

Gibt es einen einfacheren Weg als ein Shell-Skript?

47
creativeDev

"Hier extrahieren" ist lediglich eine Funktion des von Ihnen verwendeten Wrappers unzip. unzip extrahiert nur das, was sich tatsächlich im Archiv befindet. Es gibt wahrscheinlich keinen einfacheren Weg als ein Shell-Skript. Aber sed, awk usw. werden dafür nicht benötigt, wenn Sie eine POSIX-kompatible Shell haben:

for f in *.Zip; do unzip -d "${f%*.Zip}" "$f"; done

(Sie DÜRFEN NICHT die * - oder Pfadnamenerweiterung umgehen.) Beachten Sie, dass Sie, wenn das Zip-Archiv ein Verzeichnis enthält, z. B. bei Eclipse-Archiven (die immer Eclipse/ Enthalten) würde auf jeden Fall mit ./Eclipse*/Eclipse/eclipse.ini enden. Fügen Sie echo vor unzip für einen Probelauf hinzu.

44
PointedEars

unzip file.Zip -d xxx Extrahiert Dateien in das Verzeichnis xxx und xxx wird erstellt, wenn es nicht vorhanden ist. Sie können die Manpage für Details überprüfen.

Die Awk-Zeile unten sollte den Job erledigen:

ls *.Zip|awk -F'.Zip' '{print "unzip "$0" -d "$1}'|sh

Siehe das Test unten,

Anmerkung dass ich |sh am Ende entfernt habe, da meine Reißverschlüsse gefälschte Archive sind; Ich möchte hier nur die generierte Befehlszeile anzeigen.

kent$  ls -l
total 0
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 001.Zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 002.Zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 003.Zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 004.Zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 005.Zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 006.Zip
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 007.Zip

kent$  ls *.Zip|awk -F'.Zip' '{print "unzip "$0" -d "$1}'
unzip 001.Zip -d 001
unzip 002.Zip -d 002
unzip 003.Zip -d 003
unzip 004.Zip -d 004
unzip 005.Zip -d 005
unzip 006.Zip -d 006
unzip 007.Zip -d 007
84
Kent

Wenn Sie p7Zip, die Befehlszeilenversion von 7Zip, installiert haben, können Sie Folgendes verwenden:

7z x '*.Zip' -o'*'
8
Franz Knülle

Fügen Sie den Ordnernamen und den Schrägstrich nach dem Wechsel hinzu, Beispiel:

unzip -d newfolder/ zipfile.Zip

Zip erstellt den Ordner 'newfolder' und extrahiert das Archiv darin.

Beachten Sie, dass der abschließende Schrägstrich nicht erforderlich ist, aber ich denke, es ist nur aus alter Gewohnheit (ich benutze Debian und Ubuntu).

5
Jnnno

aunpack von atool erledigt dies standardmäßig für alle Arten von Archiven.

1
kralyk