Finden Sie rekursiv alle Archivdateien verschiedener Archivformate und durchsuchen Sie diese nach Dateinamenmustern

Finden Sie rekursiv alle Archivdateien verschiedener Archivformate und durchsuchen Sie diese nach Dateinamenmustern

Am liebsten hätte ich einen Anruf wie diesen:

$searchtool /path/to/search/ -contained-file-name "*vacation*jpg"

... damit dieses Werkzeug

  • führt einen rekursiven Scan des angegebenen Pfades durch
  • nimmt alle Dateien mit unterstützten Archivformaten, das sollten zumindest die „gängigsten“ sein, wie zip, rar, 7z, tar.bz, tar.gz …
  • und durchsuchen Sie die Dateiliste des Archivs nach dem fraglichen Namensmuster (hier *vacation*jpg)

Ich weiß, wie man das Suchtool, Tar, Unzip und ähnliches verwendet. Ich könnte diese mit einem Shell-Skript kombinieren, suche aber nach einer einfachen Lösung, die ein Shell-Einzeiler oder ein dediziertes Tool sein könnte (Hinweise zu GUI-Tools sind willkommen, aber meine Lösung muss befehlszeilenbasiert sein).

Antwort1

Wenn Sie etwas Einfacheres als die AVFS-Lösung möchten, habe ich dafür ein Python-Skript geschrieben namensAbonnieren. Sie können eigentlich nur

$ arkfind /path/to/search/ -g "*vacation*jpg"

Dies geschieht rekursiv, sodass Sie Archive innerhalb von Archiven bis zu einer beliebigen Tiefe durchsuchen können.

Antwort2

(Adaptiert vonWie durchsuche ich komprimierte Archive rekursiv?)

InstallierenAVFS, ein Dateisystem, das transparenten Zugriff innerhalb von Archiven ermöglicht. Führen Sie diesen Befehl zunächst einmal aus, um eine Ansicht des Dateisystems Ihres Computers einzurichten, in der Sie auf Archive zugreifen können, als wären sie Verzeichnisse:

mountavfs

Wenn es sich danach /path/to/archive.zipum ein erkanntes Archiv handelt, ~/.avfs/path/to/archive.zip#folgt ein Verzeichnis, das scheinbar den Inhalt des Archivs enthält.

find ~/.avfs"$PWD" \( -name '*.7z' -o -name '*.zip' -o -name '*.tar.gz' -o -name '*.tgz' \) \
     -exec sh -c '
                  find "$0#" -name "*vacation*.jpg"
                 ' {} 'Test::Version' \;

Erläuterungen:

  • Mounten Sie das AVFS-Dateisystem.
  • Suchen Sie nach Archivdateien in ~/.avfs$PWD. Dies ist die AVFS-Ansicht des aktuellen Verzeichnisses.
  • Führen Sie für jedes Archiv den angegebenen Shell-Ausschnitt aus (mit $0= Archivname und $1= zu suchendem Muster).
  • $0#ist die Verzeichnisansicht des Archivs $0.
  • {\}anstatt {}ist erforderlich, wenn die äußeren findSubstituenten {}innere -exec ;Argumente sind (manche tun es, manche nicht).

Oder in zsh ≥4.3:

mountavfs
ls -l ~/.avfs$PWD/**/*.(7z|tgz|tar.gz|zip)(e\''
     reply=($REPLY\#/**/*vacation*.jpg(.N))
'\')

Erläuterungen:

  • ~/.avfs$PWD/**/*.(7z|tgz|tar.gz|zip)stimmt mit Archiven in der AVFS-Ansicht des aktuellen Verzeichnisses und seiner Unterverzeichnisse überein.
  • PATTERN(e\''CODE'\')wendet CODE auf jede Übereinstimmung mit PATTERN an. Der Name der übereinstimmenden Datei befindet sich in $REPLY. Durch Festlegen des replyArrays wird die Übereinstimmung in eine Liste von Namen umgewandelt.
  • $REPLY\#ist die Verzeichnisansicht des Archivs.
  • $REPLY\#/**/*vacation*.jpgstimmt mit *vacation*.jpgden Dateien im Archiv überein.
  • Der NGlob-Qualifizierer bewirkt, dass das Muster zu einer leeren Liste erweitert wird, wenn keine Übereinstimmung vorliegt.

Antwort3

Eine andere Lösung, die funktioniert, istzgrep

zgrep -r filename *.zip

Antwort4

MeinüblichLösung:

find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|DESIRED_FILE_TO_SEARCH'

Beispiel:

find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|characterize.txt'

Die Ergebnisse sind wie:

foozip1.zip:
foozip2.zip:
foozip3.zip:
    DESIRED_FILE_TO_SEARCH
foozip4.zip:
...

Wenn Sie nur die Zip-Datei mitTrefferdarauf:

find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|FILENAME' | grep -B1 'FILENAME'

DATEINAMEwird hier zweimal verwendet, Sie können also eine Variable verwenden.

Mit find können SiePFAD/ZU/SUCHE

verwandte Informationen