さまざまなアーカイブ形式のすべてのアーカイブファイルを繰り返し検索し、そのファイル名パターンを検索します。

さまざまなアーカイブ形式のすべてのアーカイブファイルを繰り返し検索し、そのファイル名パターンを検索します。

私が望む最高の呼び出しは次のとおりです。

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

...このツールは

  • 指定されたパスを再帰的に検索
  • zip、rar、7z、tar.bz、tar.gz...など、少なくとも「最も一般的な」形式でなければならないサポートされているすべてのアーカイブ形式のファイルを取得します。
  • 問題のある名前パターンがあるかどうか、アーカイブされたファイルのリストを検索します(ここ*vacation*jpg)。

検索ツール、tar、unzipなどの使い方を知っています。これをシェルスクリプトと組み合わせることができますが、シェルシングルライナーまたは専用ツール(GUIツールのヒントは大歓迎ですが、私のソリューションはコマンドラインベースである必要があります)などの単純なソリューションを探しています。

答え1

AVFSソリューションよりも簡単なものが必要な場合は、これを行うためのPythonスクリプトを作成しました。箱舟を探す。あなたは実際にこれを行うことができます

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

これは再帰的に実行されるため、任意の深さでアーカイブ内のアーカイブを表示できます。

答え2

(で適応圧縮アーカイブを再帰的にgrepする方法は?)

インストールするAVFS、アーカイブ内で透過的なアクセスを提供するファイルシステムです。まず、このコマンドを一度実行してコンピュータのファイルシステムビューを設定します。ここで、アーカイブがディレクトリであるかのようにアーカイブにアクセスできます。

mountavfs

それ以降は、/path/to/archive.zip認識されたアーカイブの場合、~/.avfs/path/to/archive.zip#そのアーカイブの内容を含むように見えるディレクトリです。

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' \;

説明する:

  • AVFS ファイルシステムをマウントします。
  • ~/.avfs$PWD現在のディレクトリのAVFSビューインでアーカイブファイルを見つけます。
  • 各アーカイブに対して指定されたシェルフラグメントを実行します($0=archive名と$1=searchパターンを使用)。
  • $0#アーカイブのディレクトリビューです$0
  • {\}{}内部パラメータを外部に置き換える場合は必要ありません(一部はこれを行い、一部はそうではありません)。find{}-exec ;

またはzsh ≥4.3から:

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

説明する:

  • ~/.avfs$PWD/**/*.(7z|tgz|tar.gz|zip)現在のディレクトリとそのサブディレクトリのAVFSビューのアーカイブと一致します。
  • PATTERN(e\''CODE'\')PATTERN が発生するたびに CODE を適用します。一致するファイルの名前はにあります$REPLYreply配列を設定すると、一致する項目が名前リストに変換されます。
  • $REPLY\#アーカイブのディレクトリビュー。
  • $REPLY\#/**/*vacation*.jpg*vacation*.jpgアーカイブのファイルを一致させます。
  • N一致するものがない場合、glob修飾子はパターンを空のリストに展開します。

答え3

もう一つの効果的な解決策はzgrep

zgrep -r filename *.zip

答え4

私のもの通常解決策:

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

例:

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

結果は次のとおりです。

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

zipファイルだけが必要な場合クリック数上:

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

ファイル名ここでは2回使用されているので、変数を使用できます。

findで使えるパス/ターゲット/検索

関連情報