7z Verzeichnisse packen

Don_2020

Lt. Commander
Registriert
Aug. 2019
Beiträge
1.681
Ich möchte verschiedene Unterverzeichnisse mitr 7z packen. Jedes Unterverzeichnis in eine eigene Datei.
C:\Testdaten\A enthält keine weiteren Ordner
C:\Testdaten\B enthält weitere Unterordner

Im Ergebnis soll das rauskommen:

A.7z
B.7z
 
Hab gerade keinen Computer da, aber sollte doch einfach mit Rechtsklick auf den Ordner 7-Zip>Archiv erstellen oder so gehen, da kannst du dann noch zwischen ZIP und 7Z auswählen. Falls du Windows 11 nutzt, musst du noch ganz unten im Rechtsklick Menü die anderen Optionen einblenden.
 
Ich möchte nicht jeden Ordner einzeln auswählen, sondern alle Verzeichnisse im Unterordner "Testdaten" sollen gepackt werden. Im Ordenr "Testadten" befinden sich ca. 500 Unterordner.
Das von ATist nbeschriebene Vorgehen passt genau für einen Ordner.
Markiere ich mehrer Orndner wird als Dateiname "Testdaten" vorgewählt. Genau das möchte ich aber nicht.
 
Wenn ich wüste wie man eine Scriptdatei schreibt würde ich hier nicht Fragen.
Google hat bisher nichts brauchbares gefunden.
 
Don_2020 schrieb:
Markiere ich mehrer Orndner wird als Dateiname "Testdaten" vorgewählt. Genau das möchte ich aber nicht.
Du kannst doch den Namen des Archivs vorm Komprimieren wählen oder auch hinterher umbenennen.
Ergänzung ()

Don_2020 schrieb:
Wenn ich wüste wie man eine Scriptdatei schreibt würde ich hier nicht Fragen.
Google hat bisher nichts brauchbares gefunden.
7-Zip liefert doch bei der Installation eine brauchbares User Guide für die Command Line Version mit.
 
Ist doch ganz einfach.
Du öffnest deinen Explorer, wählst deinen Ordner, hier D:\Dokumente gehst zu 7zip > Add to Archive, da packst du alles.
Rechts siehst du die in 7zip entpackte Datei mit allen Ordnern.
7zip datei.png
 
Das ist aber dann nur eine 7zip. So wie ich das verstehe, soll für jeden Ordner eine eigene angelegt werden.
 
Genau. Jeder Ordner (nicht jedoch die Unterordner in einem Verzeichnis) soll in eine eigene Datei.
 
hab grad mal nen Script geschrieben, als Beispiel. (da ich Linuxer bin ist das natürlich nen shell script, explizit für Bash). Ich habs getestet, es sucht nach den Verzeichnisnamen und macht aus jedem eine einzelne Zip Datei mit dem Inhalt der Ordner und das 7z mit dem Namen der Ordner:


Bash:
#!/bin/bash
for i in $(ls --format=single-column -F | grep -i \/ | sed s/\\//""/)
do
  echo "gerade bearbeitet wird:"$i":"
  7z a "$i.7z" $i
done

Edit:
Es sucht in dem Verzeichnis wo es liegt/ausgeführt wird nach den Ordnern erster Ebene. und nur Ordner.
Die 7z Dateien landen im selben Verzeichnispfadwo es ausgeführt wird. ganz simpel gestrickt das Script.
Es ist keine parallelisierung eingebaut, was aber super einfach wäre.ein job per Verzeichnis starten lassen. (einfach ein & am ende der 7z Befehlszeile)

Edit:
am längsten hat natürlich gedauert nach den passenden abfragen und Filtern zu suchen und das zu testen, soo lang wars aber auch nicht :D

also optional parallel:
Bash:
#!/bin/bash
for i in $(ls --format=single-column -F | grep -i \/ | sed s/\\//""/)
do
  echo "gerade bearbeitet wird:"$i":"
  7z a "$i.7z" $i &
done

Edit:
Zu bedenken ist, das je nach Rechner und Hardware das parallele starten sehr von nachteil oder Vorteil sein kann. HDD kommen garnicht gut mit dem parallelen zugriff klar... SSd werden Teils deutlich schneller umso mehr parallel läuft.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Stuffz
@Joe58: Danke das ist der richtige Weg. Was noch fehlt ist die Grö0e der Wiederherstellungsinformationen (10% wäre gut) und die Größe der Teildateien (z.B. 700 MB).

@Alexander2: Leider funktioniert das Script nicht unter Windows.
 
Sofern es nicht unbedingt 7zip sein muss:
WinRAR bietet die Funktion, jede ausgewaehlte Datei bzw. jeder Ordner in ein eigenes Archiv zu packen (-> Reiter: "Datei" -> haken bei "Jede Datei in ein eigenes Archiv packen").
Es lassen sich auch Profile vordefinieren und im Kontextmenue hinterlegen.
Allerdings ist dann nur *.rar, *.rar4 oder *.zip moeglich.
 
  • Gefällt mir
Reaktionen: unlock
Was bezweckst du eigentlich damit, dass jeder Ordner einzeln verpackt werden soll?
 
Don_2020 schrieb:
@Joe58: Danke das ist der richtige Weg. Was noch fehlt ist die Grö0e der Wiederherstellungsinformationen (10% wäre gut) und die Größe der Teildateien (z.B. 700 MB).

@Alexander2: Leider funktioniert das Script nicht unter Windows.
Wieso, hat heute nicht praktisch jeder git-bash drauf? Musst nur aufpassen, das Script mit Unix-Newlines zu speichern.

@Alexander2 Die zweite Variante mit In-den-Hintergrund-forken würde ich nicht nehmen. 7z arbeitet schon parallel, daher unnötig. Macht nur schnell den Rechner platt.
 
Ja, kommt definitiv auf den usecase an, bei extrem vielen Ordnern mit sehr sehr kleinen Dateien oder wenig Inhalt würde ich dem durchaus eine Chance geben. eine Begrenzung auf x parallel gestartete Instanzen wäre noch sinnvoll und möglich, aber zu viel für mal eben schnell nen Script hin pfuschen.
 
Don_2020 schrieb:
Was noch fehlt ist die Grö0e der Wiederherstellungsinformationen (10% wäre gut) und die Größe der Teildateien (z.B. 700 MB).
Das solltest du als Medienkompetenzübung doch sicher selbst in der Hilfe von 7zip nachlesen können. Die beiden Sachen kann man sicher als Parameter im Skript mit übergeben...
 
  • Gefällt mir
Reaktionen: slrzo und Der Lord
@Alexander2 Ja trotzdem, mit der Schleife da kann man das nicht so genau steuern. Auch die sed/grep-Orgie finde ich nicht schön. Wenn schon, dann:

Bash:
find -maxdepth 1 -mindepth 1 -print0 -type d | xargs -P$ANZAHL_DER_THREADS -n1 -0 bash -c 'cd "$0" && 7z a "../$0.7z" .'

Edit: Übersetzung: finde alles vom Typ Directory auf der Ebene mit Tiefe 1, also nur genau die Ordner darunter, übergebe die Liste als Null-Terminierte (wegen Spaces u.a. Müll) Strings zu xargs, und xargs wirft das einzeln (-n1) auf ein Bash-Kommando, welches das unter $0 vorfindet.

ANZAHL_DER_THREADS mit gewünschtem Wert als Umg.variable setzen (z.B. 4), oder statt $ANZAHL_DER_THREADS dann eben die Anzahl da, oder $NUMBER_OF_PROCESSORS unter Windows für alle Kerne unter Windows bzw. $(nproc) unter Linux. Wenn der Rechner überfahren wird: nice -n10 vor das 7z-Kommando packen.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Alexander2
Zurück
Oben