[[Vorlage(Getestet, jammy noble)]] {{{#!vorlage Wissen [:Pakete_installieren: Pakete installieren] [:Terminal: Ein Terminal öffnen] [:Paketinstallation_DEB: Ein einzelnes Paket installieren] optional [:Programme_starten:] }}} [[Inhaltsverzeichnis()]] [[Bild(./7zip_logo.png, 48, align=left)]] [sourceforge:p7zip:7z] {en} ist sowohl ein Dateiformat als auch ein Kommandozeilenprogramm zur Datenkompression. Auf Wunsch kann man auch eine eigene grafische Oberfläche installieren. Es handelt sich um die Referenzimplementierung des hocheffizienten, freien Algorithmus [wikipedia:LZMA:], der die allermeisten anderen Algorithmen in ihrer Kompressionsstärke mitunter deutlich übertrifft ([https://www.donationcoder.com/Reviews/Archive/ArchiveTools/pngs/compression-ratio01.png Vergleich] {en}). Ein Beispiel: LZMA komprimiert durchschnittlich 50% stärker als der Algorithmus [wikipedia:Deflate:] des weit verbreiteten Formats [wikipedia:ZIP (Dateiformat):ZIP]. Auch mit proprietären, kommerziellen Formaten wie [wikipedia:RAR_(Dateiformat):RAR] kann sich 7z messen. Sensible Daten können per [wikipedia:Advanced Encryption Standard:AES-256] verschlüsselt werden und ein Archiv kann bei Bedarf in beliebig große Teile zerlegt werden. Dank seiner Entwicklung als Open-Source hat 7z mittlerweile große Verbreitung gefunden. [:Archivmanager/#Archivmanager:Grafische Archivmanager] wie [:File Roller:], [:Xarchiver:] und [:Ark:] kommen mit dem Format zurecht, indem sie auf das hier beschriebene Kommandozeilenprogramm zurückgreifen. Für andere Betriebssysteme gibt es eine breite Palette an Programmen, die 7z von Haus aus unterstützen. Eine Auflistung findet sich auf der [https://7-zip.org/links.html Projekthomepage] {en}. {{{#!vorlage Hinweis Der Algorithmus LZMA stellt beim Komprimieren sehr hohe Ansprüche an die Systemleistung, insbesondere an den Arbeitsspeicher. Leistungsschwache Systeme werden spätestens bei großen Datenmengen und höheren Kompressionsstufen völlig in die Knie gehen („System Lock-up“). Um das Potenzial voll auszuschöpfen, sollten mindestens 2 GiB Arbeitsspeicher vorhanden sein und auch der Prozessor sollte eine Taktfrequenz von 2 GHz nicht unterschreiten. }}} = Installation = Der Linux-Port von 7z heißt '''p7zip'''. Es finden sich mehrere Varianten in den Paketquellen[1]: 1. Präferiert in diesem Artikel: [[Vorlage(Paketinstallation, "p7zip-full, universe, unterstützt noch weitere Formate und Algorithmen", "p7zip-rar, multiverse, optionales unfreies Modul für p7zip-full, um auch RAR-Archive entpacken zu können" ) ]] oder 1. Alternativ installieren: [[Vorlage(Paketinstallation, "p7zip, universe, unterstützt nur 7z und LZMA" ) ]] Man sollte nur eine der beiden Varianten installieren. Das Programm von '''p7zip-full''' wird mit `7z`[2] aufgerufen, dagegen '''p7zip''' mit `7zr`. Der Befehl ist bei Bedarf auszutauschen. = Verwendung auf Kommandozeile = Die allgemeine Syntax des Befehls `7z` aus dem Paket '''p7zip-full''' lautet: {{{#!vorlage Befehl 7z KOMMANDO SCHALTER ARCHIVNAME MUSTER }}} Ein Beispiel: {{{#!vorlage Befehl 7z a -t7z -m0=LZMA -mmt=on -mx=9 -md=96m -mfb=256 /home/peter/kirschkuchenrezept.7z /home/peter/kirschkuchenrezept.odt }}} * Die Befehlsteile KOMMANDO und SCHALTER werden in den anschließenden Abschnitten erläutert. * ARCHIVNAME ist ein Dateiname und identifiziert die zu bearbeitende 7z-Archivdatei. Außer beim Kommando `a` muss diese Datei existieren; beim Kommando `a` wird eine existierende Archivdatei modifiziert oder eine vorher noch nicht existierende Datei angelegt. * MUSTER ist eine Folge von einem oder mehreren Dateinamen, die auch mit Hilfe von Shell-Globs als Muster angegeben werden können. MUSTER ist immer anzugeben, wenn man Dateien in ein Archiv einfügen, daraus entnehmen oder darin aktualisieren möchte. 7z erkennt Verzeichnisse selbst und arbeitet rekursiv, es muss kein spezieller Parameter angegeben werden. == Kommandos == Mit dem Kommando wird zuerst grob festgelegt, was zu tun ist. Es ist genau ein Kommando als Buchstabe als erster Aufrufparameter lt. Tabelle 1 anzugeben. {{{#!vorlage Tabelle Tabelle 1: Kommandos +++ Kommando Beschreibung +++ `a` Dateien/Verzeichnisse einem Archiv hinzufügen bzw. eine Archivdatei erstellen. Die genaue Arbeitsweise wird in [#Tabelle5 Tabelle 5] beschrieben oder mit dem [#Schalter-u Schalter `-u`] modifiziert. +++ `b` Benchmark des Systems +++ `d` Dateien/Verzeichnisse aus einem Archiv löschen. Die genaue Arbeitsweise wird in [#Tabelle5 Tabelle 5] beschrieben oder mit dem [#Schalter-u Schalter `-u`] modifiziert. +++ `e` Einfaches Entpacken aller Dateien aus dem Archiv +++ `l` Inhalt eines Archivs auflisten. +++ `t` Archiv auf Beschädigungen prüfen. +++ `u` Archivinhalt aktualisieren. Die genaue Arbeitsweise wird in [#Tabelle5 Tabelle 5] beschrieben oder mit dem [#Schalter-u Schalter `-u`] modifiziert. +++ `x` Archiv entpacken und dabei die Verzeichnisstruktur erhalten. }}} == Schalter == Schalter sind optional nach dem Kommando als Optionen mit einem einleitenden Bindestrich `-` anzugeben. Die folgende Tabelle 2 beschreibt nur einen Auszug der wichtigsten Schalter, welche die genaue Vorgehensweise festlegen. Der Fokus liegt hier auf dem Algorithmus LZMA. Informationen zu weiteren Schaltern finden sich in den [man:7z:Manpages] {en}. Die meisten Schalter modifizieren die generelle Arbeitsweise (wie z.B. den Kompressionsgrad) des Programms, mit der [#Schalter-u Option `-u`] kann man aber individuell für die einzelne Datei situationsabhängig die Arbeitsweise steuern. {{{#!vorlage Tabelle Tabelle 2:Ausgewählte Optionen +++ Schalter Beschreibung +++ `-m` Algorithmus für Kompression festlegen (z.B. `-m0=LZMA`). +++ `-mhe=on` Die [wikipedia:Header:Kopfdaten] des Archivs verschlüsseln. +++ `-oZIEL` Nicht ins gleiche Verzeichnis (Standard), sondern nach "ZIEL" entpacken. +++ `-pPASSWORT` Archiv mit Passwort schützen. +++ `-t7z` Dateiformat festlegen (hier 7z). Weitere Formate: xz, bzip2, gzip, tar, zip und wim +++ `-mmt=on` [wikipedia:Multithreading:] für Mehrkernprozessoren oder Multiprozessorsysteme aktivieren (manuelle Festlegung der zu nutzenden Kerne mit -mmt=X) +++ `-mx=0` Stufe der Kompressionsstärke (hier 0) vorgeben. Mögliche Werte: 0=Speichern, 1=schnell und schlecht, … , 9=langsam und gut +++ `-mfb=64` Anzahl der [wikipedia:Wörterbuchkompression:Wörterbücher] (hier 64) (8, 12, 16, 24, 32, 48, 64, 96, 128, 192, 256, 273) +++ `-md=64m` Größe der Wörterbücher (hier 64 MiB) (64k, 1m, 2m, 4m, 6m, 8m, 12m, 16m, 24m, 32m, 48m, 64m, 96m, 128m) +++ `-ms=on` [wikipedia:Progressive_Kompression:Progressive ("solid") Kompression] +++ `-v128m` Das Archiv wird in mehrere Teile (Volumes) aufgeteilt (hier 128 MiB). Größenangaben werden mit einer Einheit angegeben: b=Byte, k=Kibibyte, m=Mebibyte, g=Gibibyte. Es können verschiedene Dateigrößen erstellt werden: `7z a datei.7z -v10k -v15k -v2m`. Das erste Volumen erhält 10 KiB, das Zweite erhält 15 KiB, und alle anderen erhalten 2 MiB. +++ -u'ARBEITSWEISEN' Der Schalter -u kann mehrfach angegeben werden und modifiziert die Arbeitsweise der Kommandos a, d und u. ARBEITSWEISEN steht für eine Zeichenfolge, welche in codierter Form die Arbeitsweise des Programms in bestimmten Situationen festlegt. Siehe dazu folgenden Abschnitt. }}} [[Anker(Schalter-u) ]] == Details zum Schalter -u == ## `-u[-][\!{neue_Archivdatei}]` Wenn man den Schalter `-u` verwendet, dann enthält die Zeichenfolge ARBEITSWEISEN Paare von jeweils einem Codezeichen für die Situation lt. Tabelle 3 und einem Codezeichen für die in dieser Situation gewünschte Aktion lt. Tabelle 4. Wenn man den Schalter `-u` nicht verwendet, gelten die Vorgaben nach [#Tabelle5 Tabelle 5]. Außerdem kann man eine neue zusätzliche Archivdatei erstellen und über die Zeichenfolge ARBEITSWEISEN die vorgegebenen situationsabhängigen Arbeitsweisen für die schon vorhandene Archivdatei überschreiben. {{{#!vorlage Experten Die abstrakte Syntax für den Schalter `-u` aus der Manpage des Programms ist nicht realisiert. Vermutlich ist dies eine bessere Beschreibung: \\ `-u[p#][q#][r#][x#][y#][z#][!NEUER-ARCHIVNAME]` oder `-u-` Der Code `-` kann nur alleinstehend verwendet werden. }}} Für die Kommandos a, d und u gilt zunächst bzgl. ihrer Arbeitsweise jeweils ihre Vorgabe nach [#Tabelle-5 Tabelle 5], die dann durch die Angaben im Schalter `-u` modifiziert wird. Für jede Datei im Archiv ARCHIVNAME und jede auf MUSTER passende Datei im Dateisystem wird dann die Situation lt. Tabelle 3 hinsichtlich Existenz an beiden Stellen, Zeitstempel und Größe ermittelt und die Datei dann gemäß Tabelle 4 behandelt. {{{#!vorlage Tabelle Tabelle 3: Situationen für Kommandos a, d und u +++ Code Situation im Dateisystem im Archiv +++ - Damit kann das Archiv ARCHIVNAME vor Veränderung geschützt werden, indem die Vorgaben für das jeweilige Kommando lt. [#Tabelle5 Tabelle 5] überschrieben werden. Das ist sinnvoll, wenn gleichzeitig eine neue Archivdatei erstellt wird. Dieser Code muss alleine stehen. <:-2>(nicht relevant) +++ p# Datei existiert im Archiv, wird aber nicht von MUSTER erfasst. Auswertung durch die Shell beeinflusst das Ergebnis vorhanden +++ q# Datei ist nur in der Archivdatei vorhanden. nicht vorhanden vorhanden +++ r# Datei ist nur außerhalb der Archivdatei vorhanden. vorhanden nicht vorhanden +++ x# Zeitstempel der archivierten Datei ist neuer. älter neuer +++ y# Zeitstempel der archivierten Datei ist älter. neuer älter +++ z# Zeitstempel und Größe der archivierten und der nicht archivierten Datei sind gleich. gleich gleich +++ w# Zeitstempel kann nicht ausgewertet werden, aber archivierte und nicht archivierte Datei haben unterschiedliche Größe. vorhanden vorhanden +++ !NEUER-ARCHIVNAME Angabe eines Dateinamens für ein neues Archiv. Diese Angabe muss an letzter Stelle der Zeichenfolge stehen. Die vor dem Ausrufezeichen definierten situationsabhängigen Arbeitsweisen gelten für die hier angegebene neue Archivdatei. [[BR]]Das Zeichen `!` ist ein Sonderzeichen für die Shell und muss daher immer vor Interpretation geschützt werden; dies kann durch Quotierung mit Anführungszeichen oder einem voran gestellten fallenden Schrägstrich \ erfolgen. <:-2>(nicht relevant) }}} Bei den Buchstaben `p, q,…` ist das Zeichen `#` jeweils durch eine Ziffer nach Tabelle 4 zu ersetzen. {{{#!vorlage Tabelle Tabelle 4: Mögliche Aktionen +++ Code Beschreibung der Aktion +++ 0 Der Code sorgt dafür, dass die betroffenen Dateien nach der Bearbeitung nicht im entsprechenden Archiv enthalten sind, indem er sie daraus entfernt oder gar nicht erst aufnimmt. +++ 1 Bestehende Datei im Archiv wird beibehalten bzw. in die neue Archivdatei übernommen. +++ 2 Datei im Archiv wird durch die nicht archivierte Datei ersetzt (ggf. nur in der neuen Archivdatei). +++ 3 In der Archivdatei werden sogenannte Anti-Dateien erzeugt, die beim Extrahieren dafür sorgen, dass im Zielverzeichnis vorhandene Dateien dieses Namens gelöscht werden (nur mit dem 7z-Format unterstützt)- }}} [[Anker(Tabelle5)]] Die nachfolgende Tabelle beschreibt, welche Arbeitsweisen für die Kommandos a, d und u ohne explizite Verwendung des Schalters `-u` gelten. {{{#!vorlage Tabelle Tabelle 5: Vorgaben für ARBEITSWEISEN bei den Kommandos a, d und u +++ Kommando <-7:>Situation und Aktion +++ <:>p <:>q <:>r <:>x <:>y <:>z <:>w +++ `d` (delete) 1 0 0 0 0 0 0 +++ `a` (add) 1 1 2 2 2 2 2 +++ `u` (update) 1 1 2 1 2 1 2 }}} == Beispiele == * [[Vorlage(Befehl, "7z u -ur0 /home/peter/Rezepte.7z /home/peter/Kochen_und_Backen/*.odt" ) ]] Überarbeitete Dateien mit der Erweiterung .odt werden im Archiv aktualisiert, neu hinzugekommene bleiben dagegen unberücksichtigt. * [[Vorlage(Befehl, "7z u -uq0 /home/peter/Rezepte.7z '/home/peter/Kochen_und_Backen/*.odt'" ) ]] Im Verzeichnis gelöschte Dateien mit der Erweiterung .odt werden auch aus dem Archiv entfernt. Dabei muss MUSTER gequotet werden, da es ansonsten von der Shell ausgewertet wird. Dies hätte dann zur Folge, dass im Verzeichnis nicht mehr existierende Dateien keinen Treffer erzielen, und der Schalter `-uq0` deswegen nicht greift, obwohl die Voraussetzungen ansonsten erfüllt wären. * Will man dagegen alle nicht mehr im Verzeichnis vorhandenen Dateien auch aus dem Archiv löschen, führt folgender Programmaufruf zum Ziel: \\ [[Vorlage(Befehl, "7z u -up0 /home/peter/Rezepte.7z /home/peter/Kochen_und_Backen/*" ) ]] In diesem Fall ist erwünscht, dass die Shell MUSTER auswertet, deswegen darf es nicht gequotet werden. Hier werden dann allerdings auch Dateien neu ins Archiv übernommen, die nicht die Erweiterung .odt enthalten. Will man das nicht, muss im Schalter außerdem noch der Code `r0` hinzugefügt werden. * Neu hinzugekommene Dateien mit Erweiterung .odt werden wie folgt in die neue Archivdatei '''neue_Rezepte.7z''' aufgenommen: [[Vorlage(Befehl, "7z d -u- -u'p0r2!/home/peter/neue_Rezepte.7z' /home/peter/Rezepte.7z /home/peter/Kochen_und_Backen/*.odt" ) ]] Die bestehende Archivdatei '''Rezepte.7z''' wird nicht modifiziert, dafür sorgt hier der erste Schalter `-u-`. Beachte die Quotierung wegen des Sonderzeichens `!` im zweiten Schalter! = Tipps = * Je höher die anstehenden Nummern bei den Schaltern `-mfb` und `-md` sind, desto stärker ist die Kompression. Dies wirkt sich allerdings nicht nur auf die benötigte Zeit des Vorgangs aus, sondern auch auf die Systemauslastung, insbesondere die des Arbeitsspeichers. Der Schalter `-md` legt nicht etwa die maximale Beanspruchung des Arbeitsspeichers fest. * Die progressive Komprimierung wird die Effizienz immer dann erhöhen, wenn mehrere Dateien gepackt werden sollen – speziell, wenn diese sich ähneln. Der nötige Aufwand kann durch die Methode jedoch stark in die Höhe schießen, sie sollte mit Bedacht eingesetzt werden. Ist ein Archiv progressiv komprimiert worden, können einzelne Dateien bzw. Verzeichnisse nur entpackt werden, indem alles, was sich im Archiv davor befindet, abgearbeitet wird. In einem solchen Szenario dauert das Entpacken länger. Beim Entpacken des gesamten Archivs gibt es hingegen keinen sonderlichen Zeitunterschied. * 7z alleine ist für ein [:Datensicherung:Backup] eines kompletten Linux-/Unix-Systems nicht geeignet, da es [:Rechte:Benutzer/Gruppe von Dateien] nicht speichert. Um doch ein Backup eines Linux-/Unix-Systems mit 7z zu komprimieren, empfiehlt es sich, dieses vorher mit [:tar:] zu einem einzelnen Datenstrom zusammenzufügen. Beispiel: [[Vorlage(Befehl, "tar cf - PFAD | 7za a -si ERGEBNIS.tar.7z" ) ]] Das Entpacken eines solchen Archivs läuft dann wieder in umgekehrter Reihenfolge ab (Achtung: Das Zielverzeichnis '''ZIELPFAD''' muss vorhanden sein!): [[Vorlage(Befehl, "7za x -so ERGEBNIS.tar.7z | tar xf - -C ZIELPFAD --numeric-owner" ) ]] = Links = * [:Packprogramme:] {Übersicht} Übersichtsartikel zu Programmen für Archivierung und Komprimierung * [https://7-zip.org/7z.html Projektseite] {en} * [https://7-zip.org/7z.html 7z Format] {en} * [https://documentation.help/7-Zip/update1.htm Details zum Schalter `-u`] {en} -- teilweise fehlerhaft! * [wikipedia:7z:] #tag: Shell, Packer, Komprimierung, Archivmanager, Datensicherung