私が望む最高の呼び出しは次のとおりです。
$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
インストールする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 を適用します。一致するファイルの名前はにあります$REPLY
。reply
配列を設定すると、一致する項目が名前リストに変換されます。$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で使えるパス/ターゲット/検索