Wie komprimiere ich mehrere Dateien in separate Archive?

Wie komprimiere ich mehrere Dateien in separate Archive?

Ich gebe zu, diese Frage wurde hier schon einmal gestellt:

WieIn einzelne Dateien komprimierenwobei die fragende Person das von ihr verwendete Betriebssystem nicht spezifizierte und keine Antworten erhielt.

Ich muss ein riesiges Verzeichnis in mehrere ZIP-Dateien aufteilen, die nicht voneinander abhängig sind. Also statt:

Datei1.zip
Datei2.z01
Datei3.z02

Ich hätte stattdessen gerne den folgenden Satz von Dateien:

Datei1.zip
Datei2.zip
Datei3.zip

Im Grunde ist das meine Frage. Ich verwende OS X, daher wäre ein Shell-Skript oder AppleScript die einfachste Lösung.

Außerdem gibt es hier einen Typen, der das Gleiche gefragt hat - nur wollte er ein .tar-Archiv erstellen: WieErstellen separater Archive für einen Satz von Dateien

Die Antwort ist richtig, führt aber zu TAR-Dateien:

for file in `ls *`; do tar -czvf $file.tar.gz $file ; done

PS: Dieser letzte Teil ist nur für diejenigen unter Ihnen, die gut in Keyboard Maestro sind:

Ich habe auch versucht, dies in Keyboard Maestro durchzuführen. Ich habe eine „for each“-Aktion eingerichtet, die die Dateipfade ermittelt und dann ein Shell-Skript auslöst. Die Ausgabe ist korrekt und das Makro funktioniert, wenn ich es in das Terminal einfüge (z. B. zip /Users/me/Desktop/test /Users/me/Desktop/test.txt).

Wenn ich die beiden Variablen jedoch an das Shell-Skript übergebe, funktioniert Keyboard Maestro nicht:
zip "$KMVAR_zipPath" "$KMVAR_sourcePath"

Antwort1

Die Lösung ist ziemlich einfach. Wenn Sie dies rekursiv für jede Datei tun möchten, verwenden Sie find. Es werden alle Dateien und Verzeichnisse aufgelistet, auch in Unterverzeichnisse.

find . -type f -execdir zip '{}.zip' '{}' \;

Erläuterung:

  • Das erste Argument ist das Verzeichnis, in dem Sie beginnen möchten..
  • Dann beschränken wir es auf die Suche nach Dateien ( -type f)
  • Mit dieser -execdirOption können wir für jede gefundene Datei einen Befehl ausführen, der aus dem Verzeichnis der Datei ausgeführt wird.
  • Dieser Befehl wird zip file.txt.zip file.txtbeispielsweise als ausgewertet, da alle Vorkommen von {}durch den tatsächlichen Dateinamen ersetzt werden. Dieser Befehl muss mit beendet werden\;

Natürlich findgibt es noch mehr Optionen. Wenn Sie stattdessen einfach in Ihrem aktuellen Verzeichnis bleiben und nicht in Unterverzeichnisse wechseln möchten:

find . -type f -maxdepth 1 -execdir zip '{}.zip' '{}' \;

Wenn Sie es auf bestimmte Dateitypen beschränken möchten, verwenden Sie die -nameOption (oder -inamefür die Groß-/Kleinschreibung nicht berücksichtigende Übereinstimmung):

find . -type f -name "*.txt" …

Alles andere (einschließlich der Schleife über fordie Ausgabe von ls *) hat meiner Meinung nach eine ziemlich hässliche Syntax und kann abbrechen, z. B. bei Dateien mit Leerzeichen im Namen oder aufgrund zu vieler Argumente.

verwandte Informationen