Home / LinuxUser / 2012 / 04 / Suche in komprimierten Dateien und Archiven

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Eingedost
(161 Punkte bei 4 Stimmen)
Aufteiler
(161 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.

AA_haystack_supajem_sxc_1136548.jpg

© Supajem, sxc.hu

Nadel im Datenhaufen

Suche in komprimierten Dateien und Archiven

12.03.2012 Über die Kommandozeile flink in komprimierten Dateien und Archiven zu suchen, spart viel Zeit. Die richtigen Tools dazu bringt praktisch jedes Linux-System von Haus aus mit.

Um Platz für aktuell nicht mehr benötigte Daten zu schaffen, bietet es sich an, einzelne Dateien zu komprimieren oder diese zu einem komprimierten Archiv zusammenzufassen (siehe Kasten "Komprimierte Datei versus Archiv"). Das Sichern erfolgt danach meist auf einem externen Medium, beispielsweise auf einer DVD, einer weiteren Festplatte oder einem Server im Rechenzentrum.

Komprimierte Datei versus Archiv

Die in diesem Artikel vorgestellten Programme fallen in einigen Fällen in eine der beiden Kategorien Datenkompression und Erzeugen von Archiven, andere kombinieren beides. Zur ersten Kategorie zählen die Tools XZ, Gzip und Bzip2; die zweiten Kategorie besetzt Tar. Zip, 7-zip und Rar verbinden beide Techniken.

Um die mit Gzip, Bzip2 und XZ komprimierten Tar-Archive zu verarbeiten, müssen die Komprimierungsprogramme als Helfer installiert sein. Tar ruft diese direkt auf. Generell erkennen Sie leicht an der Dateiendung, um welche Art von Archiv oder Kompression es sich handelt. Die Tabelle "Dateiendungen" gibt Aufschluss über gängige Formate.

7-zip erweist sich als Spezialfall: Dateien dieses Typs haben üblicherweise die Endung .7z. Die passenden Tools dazu heißen 7z, 7za und 7zr. Der Unterschied liegt darin, welche Formate (zum Teil inklusive Gzip, Bzip2, XZ, LZMA, Rar oder Zip) das Programm beherrscht. Die Namen der Pakete unter Debian und Ubuntu sind p7zip (7zr), p7zip-full (7z, 7za) und p7zip-rar (Rar-Plugin für 7z).

Dateiendungen

Typ Endung
Komprimierte Dateien
Gzip .gz
Bzip2 .bz2
XZ .xz
Archive
Zip .zip
7zip .7z
Rar .rar
Tar .tar
Tar+Gzip .tar.gz
Tar+Bzip2 .tar.bz2
Tar+XZ .tar.xz

Erst zu einem späteren Zeitpunkt taucht meist die spannende Frage auf, wie Sie etwas in diesen komprimierten Dateien und Archiven wiederfinden. Meist kommen einem nur noch Fragmente in den Sinn – ein Teil des Dateinamens, der ungefähre Zeitraum der letzten Bearbeitung oder ein Ausschnitt des Inhalts.

Um die Datei oder das Archiv einfach auszupacken, helfen die Kommandos aus der Tabelle "Archive entpacken". Danach prüfen Sie, ob die gewünschten Inhalte vorliegen. Dieses Vorgehen erweist sich bei kleinen Datenmengen durchaus als praktikabel.

Bei größeren Datenmengen stößt es aber schnell an seine Grenzen, beispielsweise, wenn für die ausgepackten Daten nicht genügend Speicherplatz bereitsteht. Deshalb haben findige Entwickler einfachere und effizientere Wege zum Durchsuchen der Archive ersonnen.

Archive entpacken

Typ Kommando
Komprimierte Dateien
Gzip gunzip Datei.gz, unp Datei.gz
Bzip2 bunzip2 Datei.bz2, unp Datei.bz2
XZ unxz Datei.xz, unp Datei.xz
Archive
Zip unzip Archiv.zip, unp Archiv.zip
7zip 7z e Archiv.7z, unp Archiv.7z
Rar unrar e Archiv.rar, unp Archiv.rar
Tar tar -xf Archiv.tar, unp Archiv.tar
Tar+Gzip tar -xzf Archiv.tar.gz, unp Archiv.tar.gz
Tar+Bzip2 tar -xjf Archiv.tar.bz2, unp Archiv.tar.bz2
Tar+XZ tar -xJf Archiv.tar.xz, unp Archiv.tar.xz

Ohne Auspacken

Im Fall einer komprimierten Datei entspricht der Dateiname in der Regel dem Namen der gepackten Datei. Ein Archiv dagegen fasst unter einem eigenen Dateinamen mehrere Dateien zusammen. Die einzelnen Programme bieten jedoch eine Option, über die Sie die Liste im Archiv ausgeben. Mit den Kommandos aus Tabelle "Inhalt auflisten" durchsuchen Sie das Archiv nur nach Dateinamen und packen es nicht auf den Datenträger aus.

Inhalt auflisten

Typ Kommando
Komprimierte Dateien
Gzip gzip -l Datei.gz
Bzip2 keine Option
XZ xz -l Datei.xz
Archive
Zip unzip -l Archiv.zip
7zip 7z l Archiv.7z
Rar unrar l Archiv.rar
Tar tar -tf Archiv.tar
Tar+Gzip tar -tzf Archiv.tar.gz
Tar+Bzip2 tar -tjf Archiv.tar.bz2
Tar+XZ tar -tJf Archiv.tar.xz

Die Dateiliste des Archivs filtern Sie bei Bedarf mit einem Grep-Kommando, indem Sie den gewünschten Namen als Muster verwenden. Beide Kommandos verbinden Sie dazu über eine Pipe miteinander. Die ausgegebene Dateiliste beinhaltet in jeder Zeile nur einen Dateinamen. Daher gibt das Grep-Kommando nur die Zeilen zurück, auf die das Suchmuster des Dateinamens passt. Drei Varianten von Grep helfen dabei [1]:

  • grep -F (alternativ: fgrep oder grep --fixed-strings): Mit diesem Aufruf extrahieren Sie ausschließlich exakte Vorkommen einer Zeichenkette im Datenstrom. Sonderzeichen ignoriert das Tool.
  • grep -G (alternativ: grep --basic-regexp): Grep ohne Auswahl des Suchmuster-Typs nutzt eine einfachere Variante von regulären Ausdrücken und nimmt das Suchmuster dementsprechend nicht so wortwörtlich wie Fgrep. Es interpretiert verschiedene Sonderzeichen (Wildcards), beispielsweise * als Ausdruck für beliebig viele beliebige Zeichen. Diese einfachen regulären Ausdrücke sind ähnlich (aber nicht identisch) zu den Wildcards, die Sie in der Shell zum Auswählen von Dateien nutzen.
  • egrep (alternativ: grep -E oder grep --extended-regexp): Die "extended regular expressions", also erweiterte reguläre Ausdrücke, entsprechen in etwa den Suchmustern in anderen Kommandozeilenprogrammen, wie zum Beispiel in Sed und Awk, im Editor Vi und im Betrachter Less.

Grep früher und heute

In Debian-Releases bis zur Version 4.0 ("Etch") waren Fgrep und Egrep Verweise auf Grep. Diese reichten den Aufruf an Grep mit der entsprechenden Option und den Parametern weiter, grep -F für fgrep und grep -E für egrep. Das erfolgte über ein Shell-Skript:

$ cat /bin/fgrep
#!/bin/sh
exec grep -F ${1+"$@"}

Mittlerweile hat sich das geändert: Die Kommandos liegen bei den aktuelleren Debian-Versionen als eigenständige Binaries vor. Scientific Linux und Ubuntu handhaben das ähnlich wie Debian, der Red-Hat/Fedora-Ableger CentOS hingegen nicht. Listing 1 zeigt, dass unter CentOS 5.5 Fgrep und Egrep auf Grep linken – zu erkennen am l in den Benutzerrechten und dem Verweis in der rechten Spalte.

Die beiden Kommandos Fgrep und Egrep sind zudem als veraltet gekennzeichnet (siehe dazu die Manpage der Kommandos) und nur aus historischen Gründen noch in dieser Form enthalten. Es steht daher zu erwarten, dass diese Kommandos in der Zukunft entfallen und es stattdessen Grep mit der entsprechenden Option aufzurufen gilt. Ein genauer Termin für diese doch recht gravierende und umstrittene Änderung steht jedoch noch nicht fest.

Listing 1

$ ls -l $(which egrep fgrep grep)
lrwxrwxrwx 1 root root     4 22. Okt 2010  /bin/egrep -> grep*
lrwxrwxrwx 1 root root     4 22. Okt 2010  /bin/fgrep -> grep*
-rwxr-xr-x 1 root root 85060 26. Sep 2009  /bin/grep*

Für ein tar.gz-Archiv liefert die kurze Befehlsfolge aus Listing 2 erste Treffer. Zuerst durchsucht Tar das angegebene Archiv und schickt das komplette Inhaltsverzeichnis auf die Standardausgabe in eine Pipe. Aus dieser erhält Fgrep die Eingabedaten und filtert diese nach dem angegebenen Muster – hier dem Dateinamen.

Listing 2

$ tar -tzf Archiv.tar.gz | fgrep --color Dateiname

Die Option --color wäre für den Aufruf nicht unbedingt notwendig. Sie dient nur der besseren Übersicht in der Ausgabe und sorgt dafür, dass Fgrep den Suchtreffer in der Ausgabe farbig hervorhebt. Für komplexere Suchen mit Sonderzeichen eignen sich Grep und Egrep, zum Beispiel, wenn der genaue Dateiname unklar ist und Sie über ein Muster suchen möchten.

Die Befehlsfolge aus Listing 3 entspricht jener aus Listing 2, nur dass hier ein Bzip2-komprimiertes Archiv zum Einsatz kommt. Mit Hilfe von Egrep und einem regulären Ausdruck als Muster filtern Sie alle Dateinamen aus dem Inhaltsverzeichnis des Archivs heraus, die auf das Muster passen.

Listing 3

$ tar -tjf archiv.tar.bz2 | egrep --color "^rechnung.1[5-7]\.pdf"

Das Sonderzeichen ^ im Suchmuster legt fest, dass die Zeichenkette rechnung nur dann einen Suchtreffer ergeben darf, wenn sie am Zeilenanfang steht. Auf ein beliebiges Zeichen (.) folgen zwei Ziffern, wobei die erste Ziffer mit 1 vorgegeben ist, wohingegen die zweite Ziffer aus dem Bereich von 5 bis 7 stammen darf. Das Musterende bildet ein Punkt, den Sie mit einem Backslash schützen, da Grep ihn sonst als Sonderzeichen interpretiert, und die Zeichenkette pdf. Gültige Treffer für dieses Muster wären zum Beispiel rechnung015.pdf, rechnung817.pdf, rechnung-16.pdf und rechnung-16.pdf.bak.

Kennen Sie von der gesuchten Datei nur das ungefähre Datum der letzten Änderung, wählen Sie einen anderen Weg: Die Tar-Option -v zeigt ausführliche Informationen zu den archivierten Dateien an, also Zugriffsrechte, Eigentümer und Gruppe, Größe, Modifikationsdatum sowie den Dateinamen. Um eine Liste aller Dateien zu erhalten, die einen Zeitstempel vom 11., 12., 13., 21., 22. oder 23. Dezember 2011 besitzen, hilft analog zu obigem Beispiel der Aufruf aus Listing 4.

Listing 4

$ tar -tjvf Archiv.tar.bz2 | egrep --color "2011-12-[12][1-3]"

Egrep fungiert hierbei als Filter der Ausgabe von Tar. Nur die Zeilen, die die Zeichenkette 2011-12-11, 2011-12-12, 2011-12-13, 2011-12-21, 2011-12-22 oder 2011-12-23 enthalten, landen im Ergebnis. Alle Zeichen, die in eckigen Klammern stehen, behandelt das Tool beim Mustervergleich als Alternativen. Hier ergibt sich entweder Ziffer 1 oder 2, gefolgt von der Ziffer 1, 2 oder 3. Mit dieser kompakten Schreibweise des Datums formulieren Sie alle sechs Kombinationen, ohne sie auszuschreiben. Selbst in dieser überschaubaren Situation sparen Sie so bereits Schreibarbeit.

Möchten Sie das Gegenteil erreichen – also alles ausgeben mit Ausnahme dessen, was dem Muster entspricht – verwenden Sie zusätzlich die Option -v (Listing 5). Damit enthält die Ausgabe zwar Dokumente mit dem Muster 2011-11-30 oder 2011-12-24, aber nicht 2011-12-13.

Listing 5

$ tar -tjvf Archiv.tar.bz2 | grep -E -v "2011-12-[12][1-3]"

Komprimierte Dateien

Der erste Aufruf für die Suche in einer komprimierten Datei folgt dem bisher bekannten Muster – Auspacken der Datei auf die Standardausgabe (Tabelle "Archive auspacken"), anschließendes Filtern mittels Grep. Listing 6 zeigt ein Beispiel mit einer Bzip2-komprimierten Datei.

Listing 6

$ bzip2 -dc Datei.bz2 | grep -F "Suchmuster"

Grep gibt alle Zeilen auf die Standardausgabe aus, die auf das Suchmuster passen und mindestens einen Treffer beinhalten. Bei Binärdateien liefert es die Mitteilung Übereinstimmungen in Binärdatei (Standardeingabe).

Interessieren Sie die Zeichenketten, die einen Treffer erzeugt haben, hilft die Option -o. Damit gibt Grep diese zeilenweise aus. Die Anzahl der Treffer ermitteln Sie, indem die Ausgabe über eine Pipe an das Kommando wc -l weiterreichen (Abbildung 1).

Abbildung 1

Abbildung 1: Über eine Kette von Kommandos ermitteln Sie ganz leicht die Anzahl der Fundstellen für einen String in einer komprimierten Datei.

Die Tabelle "Archive auspacken" enthält eine dritte Spalte mit alternativen Kommandos, die exakt das gleiche wie jene in Spalte 2 bewirken. Viele Werkzeuge bringen Varianten mit, die sich namentlich an das Tool Cat anlehnen. Letzteres gibt den Inhalt einer Datei auf der Standardausgabe aus, wie zum Beispiel xzcat den entpackten Inhalt einer XZ-komprimierten Datei.

Das Programm Ucat gehört zum Unp-Paket [2]. Dies enthält kleine Perl-Skripte, die je nach Format den richtigen Befehl zum Extrahieren ausführen. Gemäß Quellcode unterstützt die Software beispielsweise die Formate Gzip, Tar.Gzip, Bzip2, Tar.bzip2, XZ, Tar.XZ, LZip, Tar.LZip und 7zip. Als Backend nutzt Ucat die entsprechenden Kommandozeilen-Tools, was voraussetzt, dass Sie diese installiert haben.

Archive auspacken

Typ Kommando Alternativkommando
Komprimierte Dateien
Gzip gzip -dc Datei.gz zcat Datei.gz
Bzip2 bzip2 -dc Datei.bz2 bzcat Datei.bz2
XZ xz -dc Datei.xz xzcat Datei.xz
Archive
Zip unzip -p Archiv.zip ucat Archiv.zip
7zip 7z e Archiv.7z -so ucat Archiv.7z
Rar unrar p Archiv.rar ucat Archiv.rar
Tar tar -Of Archiv.tar ucat Archiv.tar
Tar+Gzip tar -xOzf Archiv.tar.gz ucat archiv.tar.gz
Tar+Bzip2 tar -xOjf Archiv.tar.bz2 ucat Archiv.tar.bz2
Tar+XZ tar -xOJf Archiv.tar.xz ucat Archiv.tar.xz

Die Komprimierungsprogramme bringen eigene Werkzeuge zum Suchen mit. Gzip enthält Zgrep, Zfgrep und Zegrep. Bei allen drei Programmen handelt es sich um Shell-Skripte, wobei Zgrep recht umfangreich ausfällt und die eigentliche Arbeit leistet. Zfgrep und Zegrep bestehen aus wenigen Zeilen und rufen lediglich Zgrep mit den Optionen -F beziehungsweise -E auf.

Bei Bzip2 und XZ kommt das selbe Prinzip zum Tragen: Hier heißen die Werkzeuge jeweils Bzgrep, Bzfgrep und Bzegrep beziehungsweise XZgrep, XZfgrep und XZegrep. Obiges Beispiel zur Suche in der Bzip2-Datei ließe sich daher vereinfachen, ähnliches gilt für Aufrufe mit Zgrep und XZgrep.

Wie in Abbildung 2 zu sehen, sucht der Helfer alle Einträge in der Datei, die eine Zeichenkette enthalten, welche mit M beginnt, gefolgt von zwei beliebigen Zeichen und darauf der Zeichenkette er.

Abbildung 2

Abbildung 2: Bzegrep vereinfacht die Suche in gepackten Archiven.

Für die Suche in Zip-Archiven existiert Zipgrep. Das Shell-Skript gehört zum Unzip-Paket. Bei der Mustersuche greift es auf Unzip und Egrep zurück. Gemäß Manpage reicht Zipgrep alle Optionen und Parameter durch, die Egrep kennt. Im Test stellte sich jedoch heraus, das Zipgrep etwas nachlässig programmiert ist, was dazu führt, dass es Langoptionen ignoriert [3].

Für jeden Treffer gibt das Programm den Dateinamen aus, gefolgt von einem Doppelpunkt und nachfolgend der Zeile mit der passenden Zeichenkette. Wünschen Sie ein farbiges Hervorheben der Treffer, gelingt das derzeit nur über einen kleinen Umweg, da Zipgrep sich an der bekannten Grep-Option --color verschluckt. Deswegen bleibt als Ausweg nur die Kombination von beiden Tools (Abbildung 3). Listing 7 zeigt, wie Sie die beiden Kommandos zu einer Kette verbinden.

Abbildung 3

Abbildung 3: Ein farbiges Hervorheben der Treffer gelingt im Fall von Zipgrep nur durch nochmaliges Kombinieren mit Grep, da das eigentliche Tool Optionen für Grep verschluckt.

Listing 7

$ zipgrep "[Pp]reis.*pdf" archiv.zip | grep --color -E "[Pp]reis.*pdf"
Tip a friend    Druckansicht Bookmark and Share
Kommentare

2452 Hits
Wertung: 0 Punkte (0 Stimmen)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

LinuxUser 05/2014

Aktuelle Ausgabe kaufen:

Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,95 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 60,60) können Sie im Medialinx-Shop bestellen.

Tipp der Woche

Bilder vergleichen mit diffimg
Bilder vergleichen mit diffimg
Tim Schürmann, 01.04.2014 12:40, 1 Kommentare

Das kleine Werkzeug diffimg kann zwei (scheinbar) identische Bilder miteinander vergleichen und die Unterschiede optisch hervorheben. Damit lassen sich nicht nur Rätsel a la „Orignial und Fäls...

Aktuelle Fragen

programm suche
Hans-Joachim Köpke, 13.04.2014 10:43, 8 Antworten
suche noch programme die zu windows gibt, die auch unter linux laufen bzw sich ähneln sozusagen a...
Funknetz (Web-Stick)
Hans-Joachim Köpke, 04.04.2014 07:31, 2 Antworten
Bei Windows7 brauche ich den Stick nur ins USB-Fach schieben dann erkennt Windows7 Automatisch, a...
Ubuntu 13.10 überschreibt immer Windows 8 Bootmanager
Thomas Weiss, 15.03.2014 19:20, 8 Antworten
Hallo Leute, ich hoffe das ich richtig bin. Ich habe einen Dell Insipron 660 Ich möchte gerne Ub...
USB-PTP-Class Kamera wird nicht erkannt (Windows-only)
Wimpy *, 14.03.2014 13:04, 15 Antworten
ich habe meiner Frau eine Digitalkamera, AGFA Optima 103, gekauft und wir sind sehr zufrieden dam...
Treiber
Michael Kristahn, 12.03.2014 08:28, 5 Antworten
Habe mir ein Scanner gebraucht gekauft von Canon CanoScan LiDE 70 kein Treiber wie bekomme ich de...