web-dev-qa-db-ja.com

複数のZipファイルで文字列を検索する

SunOS 5.10に取り組んでいます。約200のZipファイルを含むフォルダがあります。各Zipファイルには、テキストファイルが1つだけ含まれています。すべてのZipファイルのすべてのテキストファイルで特定の文字列を検索したいと思います。

私はこれを試しました(文字列「ORA-」を含むZipファイル内のテキストファイルを検索します)が、機能しませんでした。

zipgrep ORA-1680 *.Zip

Zipファイルを解凍せずにそれを行う正しい方法は何ですか?

25
ziggy

一般に、何らかの方法で圧縮解除しないと、圧縮ファイル内のコンテンツを検索することはできません。 zipgrepはシェルスクリプトであり、unzipとegrep自体をラップしているため、手動で行うこともできます。

for file in *.Zip; do unzip -c "$file" | grep "ORA-1680"; done

一致するZipファイルのリストだけが必要な場合は、次のようなものを使用できます。

for file in *.Zip; do
    if ( unzip -c "$file" | grep -q "ORA-1680"); then
        echo "$file"
    fi
done

この方法では、ファイルをディスクに解凍するのではなく、標準出力(つまりメモリ)に解凍するだけです。もちろん、grep -a Zipファイルですが、ファイルの内容とパターンによっては、誤検知や誤検知が発生する場合があります。

27
Noah

zipgrepは単一のファイルを取ります。複数のファイルで機能させるには、ループに入れます。

for i in *.Zip
do
   zipgrep ORA-1680 "$i"
done
18
dogbane

[〜#〜] avfs [〜#〜] ファイルシステムは、すべてのアーカイブファイル/path/to/foo.Zipはディレクトリとしてアクセス可能です~/.avfs/path/to/foo.Zip#。これは Fuse ファイルシステムで、Solarisにインストールできます。 AVFSは、最も一般的なアーカイブファイル形式への読み取り専用アクセスを提供します。

mountavfs
for z in ~/.avfs$PWD/*.Zip; do
  find "$z#" -exec grep ORA-1680 {} +
done
fusermount -u ~/.avfs   # optional