さまざまなアーカイブ形式のすべてのアーカイブファイルを再帰的に検索し、ファイル名のパターンを検索します。

さまざまなアーカイブ形式のすべてのアーカイブファイルを再帰的に検索し、ファイル名のパターンを検索します。

せいぜい次のような電話をしたいです:

$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 を適用します。一致したファイルの名前は にあります$REPLYreply配列を設定すると、一致が名前のリストに変換されます。
  • $REPLY\#アーカイブのディレクトリビューです。
  • $REPLY\#/**/*vacation*.jpg*vacation*.jpgアーカイブ内のファイルと一致します。
  • globN修飾子により、一致するものがない場合にはパターンが空のリストに拡張されます。

答え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/検索

関連情報