Suchen und suchen Sie in allen komprimierten Dateien


10

Ich möchte meine Festplatte nach allen komprimierten Dateisammlungen wie zip, gzip, bzip und anderen durchsuchen und den Inhalt derjenigen nach bestimmten Dateitypen (z. B. Bildern) durchsuchen lassen. Antivirus 'mach es, also glaube ich, dass es einen Weg geben sollte.


@Rinzwind, das in den Dateien des Archivs sucht, nicht in der Liste der Dateien. Es werden Dateien gefunden, die fooaber nicht enthalten foo.png.
Terdon

Dies kann hilfreich sein, um nach einer Zip-Bombe zu suchen! +1
Sharad Gautam

Antworten:


18

Der einfachste Ansatz wäre, den Inhalt des Archivs aufzulisten und nach Dateien der entsprechenden Erweiterung zu suchen. Zum Beispiel mit einer zipDatei:

$ zip -sf foo.zip | grep -iE '\.png$|\.jpg$'
  file1.jpg
  file1.png
  file2.jpg
  file2.png

Die -sfOption weist zipan, die in einem Archiv enthaltenen Dateien aufzulisten. Dann grepwird nach einem .pngoder gesucht, das .jpgsich am Ende der Zeile befindet ( $). Die -Eermöglicht reguläre Ausdrücke erweitert, so dass wir verwenden können , |als OR und das -imacht die passende Groß- und Kleinschreibung.

Jedes Archivierungswerkzeug verfügt jedoch über einen anderen Befehl zum Auflisten des Inhalts. Ich habe ein Skript geschrieben , das mit den meisten der beliebtesten umgehen kann. Wenn Sie dieses Skript als speichern, list_compressed.shkönnen Sie Folgendes ausführen:

list_compressed.sh | grep -iE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$'

Das würde Ihnen die häufigsten Bildtypen zeigen. Beachten Sie, dass bei diesem Ansatz davon ausgegangen wird, dass der Dateityp durch die Dateierweiterung bestimmt werden kann. Es werden keine Bilddateien gefunden, die keine Erweiterung haben, und es werden keine Dateien mit der falschen Erweiterung erkannt. Es gibt keine Möglichkeit, damit umzugehen, ohne die Dateien tatsächlich aus dem Archiv zu extrahieren und fileauf jeder von ihnen auszuführen.


Wenn Sie alle Archive finden möchten , die Bilddateien auf Ihrer Festplatte enthalten, kombinieren Sie Folgendes mit find:

find / -name '*.gz' -o -name '*.tgz' -o -name '*.zip' -print0 |
    while IFS= read -r -d '' arch; do    
        list_compressed.sh "$arch" | 
            grep -qiE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$' &&
                echo "$arch contains image(s)"
    done

Der Fund Befehl wird für alle suchen .gz, .tgzoder .zipDateien (Sie können so viele Erweiterungen hinzufügen , wie Sie mögen), diese werden dann durch mein Skript übergeben. Das -qunterdrückt die normale Ausgabe von grep, es wird nichts gedruckt. Der && echoName des Archivs wird nur gedruckt, wenn das greperfolgreich war.


Gemäß meiner ursprünglichen Frage möchte ich "meine Festplatte nach allen komprimierten Dateisammlungen wie zip durchsuchen, die Bilder enthalten". Sie haben geholfen, die Archive selbst zu untersuchen, aber ich möchte nur herausfinden, welche Archive Bilder enthalten.
6ft Dan

@ 6ftDan sorry, ich hatte das Original nicht gesehen. Bitte zögern Sie nicht, Änderungen rückgängig zu machen oder erneut zu bearbeiten, die die Bedeutung Ihres Beitrags ändern. In der aktualisierten Antwort erfahren Sie, wie Sie das gesamte Dateisystem durchsuchen.
Terdon

Großartig, aber da Sie die Groß- und Kleinschreibung nicht berücksichtigen, möchten Sie vielleicht auch die Groß- und Kleinschreibung nicht berücksichtigen?
Kos

@kos hmm, das ist einfach genug , nur ändern zu tun -namezu -iname. Es hat jedoch wenig Sinn, viele Komprimierungsprogramme (z. B. gzip) benötigen die spezifische Erweiterung. GZwird nicht funktionieren.
Terdon

3

Nicht so fortgeschritten wie Terdon, aber das reicht:

Speichern Sie den folgenden Code in einem Ordner, in dem sich Ihr gesamter Code befindet, unter finda.shoder unter einem beliebigen anderen Namen:

for file in *.*; do
    if ( 7z l -slt "$file"> /tmp/$file.log); then
       echo $file:; cat /tmp/$file.log | grep -iE 'Path*'> $file.log && cat $file.log
    fi
done

Führen Sie es dann in einem Verzeichnis aus, in dem sich alle Ihre Archive befinden, und dies ist die Ausgabe:

./finda.sh 
one.7z:
Path = one/abradabra.png
Path = one/birb.png
three.rar:
Path = three/blah.png
Path = three/qwa0g.jpg
two.zip:
Path = two/whut.png

Gemäß meiner ursprünglichen Frage möchte ich "meine Festplatte nach allen komprimierten Dateisammlungen wie zip durchsuchen, die Bilder enthalten". Sie haben geholfen, die Archive selbst zu untersuchen, aber ich möchte nur herausfinden, welche Archive Bilder enthalten.
6ft Dan

@ 6ftDan Das halte ich für möglich, kann aber eine Weile dauern. In der Zwischenzeit habe ich mit Hilfe von Terdon einige Verbesserungen an meinem Skript hinzugefügt.
Blade19899

Beachten Sie, dass *.*nur Dateien mit einer Erweiterung übereinstimmen. Außerdem werden hiermit alle Dateien in allen Archiven aufgelistet, die Sie nicht auf einen Dateityp testen.
Terdon
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.