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 .zip
Dateien gefüllt , die den komprimierten Inhalt jedes Unterverzeichnisses enthalten.
Ist so etwas möglich? Wenn ja, zeigen Sie mir bitte, wie es gemacht wird.
command-line
directory
zip
Evster
quelle
quelle
Antworten:
Sie können diese Schleife verwenden in
bash
:i
ist 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 Siecd
an 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,$i
aber 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
echo
vor dem ein,zip
und Sie werden die Befehle gedruckt anstatt ausgeführt sehen.quelle
*/
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 mitecho
darin 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 mitfind -type d
anderen Tricks gelöst .zip
Binä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 auchshopt -s dotglob
festlegen, dass Glob-Muster mit ausgeblendeten Dateien übereinstimmen.for i in */; do (cd "$i"; zip -r "../${i%/}.zip" .); done