Suche nach zwei Zeichenfolgen in Zip-Archiven

1

Hoffe, jemand kann helfen.

Ich habe eine Reihe von Zip-Dateien. Diese ZIP-Dateien enthalten E-Mail-Dateien (.eml). Ich muss alle Dateien zwischen zwei Personen finden.

Anhand einer Antwort, die ich hier gefunden habe, kann ich leicht eine von ihnen finden

for z in 2013-*.zip ; do zipgrep "PATTERN" $z | sed "s/^/$z: /" ; done

Es findet den zweiten Namen in den identifizierten Dateien, mit denen ich zu kämpfen habe.

Ich habe ein zweites grep und ein zip grep auf der Akte ohne Erfolg versucht.

Jede Hilfe sehr geschätzt.

Richard
quelle
Was ist Ihre gewünschte Leistung? Die Namen der passenden Zip-Dateien oder die entsprechenden Zeilen?
Terdon
Idealerweise werden die Namen der Dateien zusammen mit dem Namen der ursprünglichen Zip-Datei angegeben. Wenn ich das auf eine Textdatei pipe, könnte ich damit die relevanten Dateien extrahieren ... es sei denn, es gibt eine Möglichkeit, dies zu tun, da es einen Treffer findet
Richard

Antworten:

1

Wenn sich die Muster nicht unbedingt in derselben Zeile befinden, zipgrepmüssen Sie sie in ein kleines Skript einbinden, das prüft, ob beide Muster in derselben Datei gefunden wurden. Versuchen Sie etwas wie:

for z in 2013-*.zip ; do 
   zipgrep "pat1" $z >/dev/null &&  
   zipgrep "pat2" $z >/dev/null && 
   echo $z; 
done

Dadurch wird jede ZIP-Datei durchsucht pat1, wenn sie gefunden wird (das ist das, was das &&bedeutet), pat2und wenn sie dies ebenfalls findet, wird der Name der Datei gedruckt. Ich leite die Standardausgabe ( >/dev/null) um, sodass nur die Dateinamen gedruckt werden. Wenn Sie auch die relevanten Zeilen sehen möchten, gehen Sie stattdessen wie folgt vor:

for z in 2013-*.zip ; do 
   zipgrep "pat1" $z &&  
   zipgrep "pat2" $z && 
   echo $z; 
done

OK, dies druckt die Zip-Datei und den Namen der passenden Datei aus der Zip-Datei. Es erstellt ein temporäres Verzeichnis ( mktemp -d), entpackt jede Zip-Datei und löscht das Verzeichnis. Wenn Sie mit großen Dateien arbeiten, die eine Weile dauern, aber ich glaube, es gibt keine Möglichkeit, dies zu vermeiden.

tmpdir=$(mktemp -d tmp.XXXXX); for z in 2013-*.zip ; do 
    zipgrep "pat1" $z >/dev/null && zipgrep "pat2" $z > /dev/null && 
    unzip $z -d $tmpdir >/dev/null 2>&1;
    for i in $tmpdir/*; do 
        grep "pat1" $i  >/dev/null && 
        grep "pat2" $i  >/dev/null && 
        echo "$z : $i" | sed "s/$tmpdir.//"; 
    done;
done; rm -rf $tmpdir;
terdon
quelle
terdon - danke dafür. habe es in ein kleines Skript geschrieben und es funktioniert ... na ja. Es gibt mir den Namen der ursprünglichen Zip-Datei. Idealerweise brauche ich auch den Namen der Datei im Zip, damit ich nur die relevanten Dateien extrahieren kann. Irgendwelche Ideen dazu?
Richard
@Richard Das ist es, was die zweite Wahl macht, nicht wahr?
Terdon
nein, leider scheint es alle dateien rauszuwerfen, die zu jeder einzelnen überprüfung passen. Ich habe eine E-Mail-Konversation zwischen mir und einem Kollegen als Test verwendet und erhalte jede E-Mail von mir und jede E-Mail vom Kollegen sowie die E-Mail zwischen uns beiden
Richard,
@Richard ah, ja ich verstehe warum, es liegt daran, dass die zip-Datei tatsächlich beide Muster enthält, aber nicht unbedingt in derselben Datei. Ich gehe davon aus, dass sich jede E-Mail in einer eigenen emlDatei in der Zip-Datei befindet, oder?
Terdon
@ Richard siehe aktualisierte Antwort.
Terdon