Befehl zum Komprimieren mehrerer Verzeichnisse in einzelne ZIP-Dateien

40

Ich habe ein einzelnes Verzeichnis, das Dutzende von Verzeichnissen enthält.

Ich bin neu in der Befehlszeile und habe Mühe, einen Befehl zu finden, der jedes Unterverzeichnis in eine eindeutige Datei sub-directory.zip komprimiert.

Am Ende wird mein primäres Verzeichnis also mit allen meinen ursprünglichen Unterverzeichnissen sowie den entsprechenden .zipDateien gefüllt , die den komprimierten Inhalt jedes Unterverzeichnisses enthalten.

Ist so etwas möglich? Wenn ja, zeigen Sie mir bitte, wie es gemacht wird.

Evster
quelle
Ich schlage vor, Sie schauen nach, wie "for-Schleifen" in der Shell durchgeführt werden können. Es gibt Onliner, die können, was Sie wollen, aber eine schöne Schleife wird viel klarer.
Lynxlynxlynx
Bedeutet das, dass ich ein separates Shell-Skript schreiben und dieses Skript dann über die Befehlszeile aufrufen muss? Entschuldigung für eine so elementare Frage. Obwohl ich Programmiererfahrung habe, ist dieses Zeug für mich neu.
Evster

Antworten:

75

Sie können diese Schleife verwenden in bash:

for i in */; do zip -r "${i%/}.zip" "$i"; done

iist der Name der Schleifenvariablen. */bedeutet jedes Unterverzeichnis des aktuellen Verzeichnisses und enthält einen abschließenden Schrägstrich in diesen Namen. Stellen Sie sicher, dass Sie cdan der richtigen Stelle sind, bevor Sie dies ausführen. "$i"benennt einfach dieses Verzeichnis, einschließlich abschließender Schrägstriche. Die Anführungszeichen stellen sicher, dass Leerzeichen im Verzeichnisnamen keine Probleme verursachen. ${i%/}ist wie, $iaber mit dem abschließenden Schrägstrich entfernt, so dass Sie das verwenden können, um den Namen der Zip-Datei zu konstruieren.

Wenn Sie sehen möchten, wie dies funktioniert, schließen Sie ein echovor dem ein, zipund Sie werden die Befehle gedruckt anstatt ausgeführt sehen.

MvG
quelle
Danke das sieht toll aus! Jedoch ein mögliches Problem, an das ich gedacht habe: Zippt dieses ALLE Verzeichnisse in jedem Unterverzeichnis in separate Dateien? Ich möchte nur die Unterverzeichnisse der ersten Ebene als einzelne komprimierte Dateien komprimieren. Ich möchte keine zusätzlichen ZIP-Dateien für Unterverzeichnisse der 2. und 3. Ebene usw. erstellen. Bitte lassen Sie mich wissen, ob dies sinnvoll ist. Danke noch einmal!
Evster
Nur die ersten Levels, die Sie angefordert haben.
Lynxlynxlynx
Die */Namen aller direkten Unterverzeichnisse, nicht aller untergeordneten Verzeichnisse. Sie erhalten also nur Reißverschlüsse für die oberste Ebene, genau so, wie Sie sie möchten. Die Version mit echodarin hätte diesen Aspekt demonstriert. Das Zippen jedes verschachtelten Verzeichnisses in eine eigene Datei wäre in der Tat aufwändiger und wird wahrscheinlich am besten mit find -type danderen Tricks gelöst .
MvG
1
@fritzmg: Ein lokaler Test auf meinem Linux deutet darauf hin, dass Dateien, die mit einem Punkt beginnen, enthalten sind. Dies wäre eine Eigenschaft des Info-ZIP-Tools und nicht des Befehls, den ich gegeben habe. Je nachdem, was Ihre zipBinärdatei ist, kann es also zu einem unterschiedlichen Verhalten kommen. Um auch ZIP-Dateien für Verzeichnisse der obersten Ebene (dh untergeordnete Verzeichnisse des aktuellen Verzeichnisses) zu erstellen, die mit einem Punkt beginnen, können Sie auch shopt -s dotglobfestlegen, dass Glob-Muster mit ausgeblendeten Dateien übereinstimmen.
MvG,
1
So erstellen Sie eine ZIP-Datei, deren Stammverzeichnis nicht das übergeordnete Verzeichnis ist:for i in */; do (cd "$i"; zip -r "../${i%/}.zip" .); done
chris