せいぜい次のような電話をしたいです:
$searchtool /path/to/search/ -contained-file-name "*vacation*jpg"
...このツールは
- 指定されたパスを再帰的にスキャンします
- サポートされているアーカイブ形式のすべてのファイルを取得します。少なくとも、zip、rar、7z、tar.bz、tar.gz などの「最も一般的な」形式である必要があります。
- アーカイブのファイルリストをスキャンして、問題の名前パターンを探します(ここ
*vacation*jpg
)
find ツール、tar、unzip などの使い方は知っています。これらをシェル スクリプトと組み合わせることもできますが、シェルのワンライナーまたは専用ツールのようなシンプルなソリューションを探しています (GUI ツールのヒントは歓迎しますが、私のソリューションはコマンド ライン ベースである必要があります)。
答え1
AVFSソリューションよりもシンプルなものが必要な場合は、私が書いたPythonスクリプトを使って、アークファインド実際にできるのは
$ arkfind /path/to/search/ -g "*vacation*jpg"
これは再帰的に実行されるため、アーカイブ内のアーカイブを任意の深さまで調べることができます。
答え2
(出典:圧縮されたアーカイブを再帰的に grep するにはどうすればいいですか?)
インストールAVFSは、アーカイブ内への透過的なアクセスを提供するファイルシステムです。まずこのコマンドを 1 回実行して、マシンのファイルシステムのビューを設定し、ディレクトリのようにアーカイブにアクセスできるようにします。
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
= アーカイブ名と$1
= 検索するパターンを使用) を実行します。 $0#
アーカイブのディレクトリビューです$0
。{\}
外側の引数が内側の引数を置き換える{}
場合には、instead ofが必要です(そうするものもあれば、そうしないものもあります)。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
アーカイブ内のファイルと一致します。- glob
N
修飾子により、一致するものがない場合にはパターンが空のリストに拡張されます。
答え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を使用すると、パス/TO/検索