Wie kann ich den Inhalt aller .zip-Dateien in einem Ordner auflisten und nach einer bestimmten Datei suchen?

28

Ich habe 348 Zip-Dateien und möchte eine Datei finden, die sich in einer der Zip-Dateien befindet. Funktioniert unzip -ldas nicht mit Platzhaltern?

Wie kann ich den Inhalt aller .zipDateien und grepüber die zusammengeführte Liste aller in den Reißverschlüssen enthaltenen Dateien auflisten?

Eduard Florinescu
quelle

Antworten:

17

Verwenden zipinfoist hier eine gute Lösung. Im Allgemeinen können Sie jedoch eine forSchleife verwenden , wenn Sie einen Befehl auf eine Liste von Dateien anwenden möchten und der Befehl keine Liste von Dateien akzeptiert :

for file in *.zip; do
    unzip -l "$file"
done \
| grep "\.zip\|setup"

Wenn die Datei, nach der Sie suchen, Leerzeichen wie your filefolgt enthält: Im regulären Ausdruck grep müssen Sie jedes Leerzeichen mit einem umgekehrten Schrägstrich wie maskieren grep "\.zip\|your\ file".

Konrad Rudolph
quelle
Funktioniert einwandfrei. Das einzige Problem ist, dass der Name der Zip nicht
angezeigt
Ich habe
deinen
Oh ja, ich hatte die Anführungszeichen rund um das Argument vergessen unzip, wie peinlich.
Konrad Rudolph
1
@JaySullivan Verwenden Sie diesen Code nicht, da er bei Pfaden mit Leerzeichen fehlschlägt. Leiten Sie niemals den Ausgang von ls weiter. Sie konnten verwenden findstattdessen.
Konrad Rudolph
12

Sie können verwenden zipinfo. Es ist in der Standard-Ubuntu-Installation enthalten. Weitere Informationen finden Sie auf der Handbuchseite .

setupVerwenden Sie beispielsweise den folgenden Befehl, um in einer Reihe von ZIP-Dateien im aktuellen Verzeichnis nach einem Muster zu suchen :

find ./ -iname *zip 2> /dev/null -print0 | xargs -0 zipinfo | grep setup
Anwar
quelle
Ich bekomme eine caution: filename not matched: case1.zip... caution: filename not matched: case348.zipfür jede Zip, getestet auf zwei Ubuntu-Betriebssystemen, 11.10 und 12.04.
Eduard Florinescu
@EduardFlorinescu Versuchen Sie die aktualisierte Antwort. Obwohl die Antwort für mich funktionierte
Anwar
das problem ist, dass die datei das enthalten könnte setupund es den gleichen zipinfo -l * | grep "setup"
fehler ausgibt
Ich habe die Antwort bearbeitet. Ich denke, es ist jetzt robuster
Anwar
1
Vielen Dank, +1 für die Mühe, aber es wird nicht funktionieren, wenn der Name der ZIP-Datei Leerzeichen enthält.
Eduard Florinescu
6

Um die Dateien in einem Zip-Archiv aufzulisten, können Sie den folgenden Befehl verwenden.

unzip -l

Um ein komprimiertes Archiv zu prüfen, sollten Sie die komprimierten Archivdienstprogramme verwenden, die für diese Art von Archivformat erstellt wurden.

Für Zip-Archive:

zipgrep --help  
usage: zipgrep [egrep_options] pattern zipfile [members...]
Uses unzip and egrep to search the zip members for a string or pattern.

Für tar-Archive:

zgrep --help
Usage: /bin/zgrep [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.

OPTIONs are the same as for 'grep'.

Es gibt noch einige andere Tools, die auch mit Archiven arbeiten. Sie können den out put in grep leiten, um dasselbe zu tun.

zcat
zcat my.archive.zip | grep "some text"

Oder Sie können die Suchfunktion dieser Tools verwenden

zless
zmore
Nelaaro
quelle