Linux gzip mehrere Unterverzeichnisse in separate Archive?

16

Wie kann ich Unterverzeichnisse in separate Archive komprimieren?

Beispiel:

directory
 subdir1
 subdir2

Sollte Unterverzeichnis1 (.tar) .gz und Unterverzeichnis2 (.tar) .gz erstellen

EarthMind
quelle

Antworten:

27

Dieses kleine Skript scheint Ihre beste Option zu sein, wenn Sie folgende Anforderungen haben:

cd directory
for dir in */
do
  base=$(basename "$dir")
  tar -czf "${base}.tar.gz" "$dir"
done

Es behandelt Verzeichnisse mit Leerzeichen in ihren Namen ordnungsgemäß.

Juliano
quelle
Es gibt mir diesen Fehler: Bash: -c: Zeile 1: Syntaxfehler: Unerwartetes Ende der Datei
EarthMind
@EarthMind: Es funktioniert hier gut. Überprüfen Sie, ob das Skript korrekt kopiert wurde.
Juliano
@EarthMind: Ich bin mir nicht sicher, ob Sie die ursprüngliche Frage richtig formuliert haben. Sie möchten dies erneut ausführen und neue .tar.gz-Dateien abrufen, während Sie die vorherigen .tar.gz-Dateien in Ruhe lassen? Versuchen Sie, "tmstamp = $ (Datum '+% Y% m% d-% H% M')" hinzuzufügen, und ändern Sie $ {base} in $ {base} - $ {tmstamp}.
freiheit
2
@EarthMind: Wenn Sie alles in eine Zeile setzen möchten, stellen Sie sicher, dass vor dem Befehl tar ein Semikolon (;) steht. Andernfalls wird base als Umgebungsvariable an tar übergeben, anstatt eine Shell-Hilfsvariable zu sein.
Juliano
@mwojtera Ihre versuchte Bearbeitung sollte seine eigene Antwort sein
Küken
10

Wie wäre es damit: find * -maxdepth 0 -type d -exec tar czvf {}.tar.gz {} \;

Erläuterung: Sie führen eine Suche für alle Elemente im aktuellen Verzeichnis durch. Maxdepth 0 führt dazu, dass der Rekurs nicht niedriger ist als die angegebenen Argumente. (In diesem Fall * oder alle Elemente in Ihrem aktuellen Verzeichnis) Das Argument 'd' für "-type" stimmt nur mit Verzeichnissen überein. Dann führt exec tar für alle Übereinstimmungen aus. ({} wird durch die passende Datei ersetzt)

Christopher Karel
quelle
1
Aber dann bekomme ich immer noch den Fehler, dass der angegebene Pfad ein Verzeichnis und keine Datei ist
EarthMind
3
gzip alleine archiviert keine Verzeichnisse
Juliano
Sie müssen Verzeichnisse tarieren, bevor Sie sie gzipen können.
ℝaphink
1
Sie benötigen tar mit der Option z, nicht straight gzip für Verzeichnisse. Sehr schöne Verwendung von find.
freiheit
3
Fehler: "find: path muss expression:;" Der erste Teil funktioniert, also habe ich verwendet (nur Verzeichnisse): for dir in `find * -maxdepth 0 -type d`; do tar -cvzf ${dir}.tar.gz ${dir}; done
JosephK
4

Dadurch wird für jede Datei in einem Verzeichnis mit dem Namen blah eine Datei mit dem Namen blah.tar.gz erstellt.

$ cd directory
$ for dir in `ls`; do tar -cvzf ${dir}.tar.gz ${dir}; done

Wenn Sie mehr als nur Verzeichnisse im Verzeichnis haben (dh auch Dateien, da ls alles im Verzeichnis zurückgibt), verwenden Sie Folgendes:

$ cd directory
$ for dir in `find . -maxdepth 1 -type d  | grep -v "^\.$" `; do tar -cvzf ${dir}.tar.gz ${dir}; done

Das grep -v schließt das aktuelle Verzeichnis aus, das findstandardmäßig im Befehl angezeigt wird.

Philip Reynolds
quelle
3
Sowohl ls als auch find wurden NICHT dafür gemacht, auf diese Weise verwendet zu werden. Insbesondere ist es beabsichtigt, Dateien in einer benutzerlesbaren Liste darzustellen und keine Dateilisten als Argumente für 'for' zu generieren. Verwenden Sie einfachfor dir in *
Juliano
1
Ich habe versucht, Ihren ersten Vorschlag, aber es funktioniert nicht mit Verzeichnissen mit Leerzeichen in ihrem Namen
EarthMind
Darüber hinaus erstellt der erste Befehl auch einen Tarball für jede Datei im Verzeichnis.
ℝaphink