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


22

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

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

zipgrep ORA-1680 *.zip

zipファイルを解凍せずにそれを行うのは正しいですか?


圧縮アーカイブを再帰的にgrepする方法も参照してください(正確な複製ではありません。要件がより複雑だったためです)。
ジル 'SO-悪であるのをやめる'

回答:


26

一般に、圧縮ファイル内のコンテンツを何らかの方法で圧縮解除せずに検索することはできません。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

この方法では、ファイルをディスクに解凍するのではなく、stdout(つまり、メモリ)にのみ解凍します。もちろんgrep -a、zipファイルのみを試すこともできますが、ファイルの内容とパターンによっては、誤検知や誤検知が発生する可能性があります。


最初のオプションはどこにファイルを解凍しますか?
ジギー

2
unzip -cファイルを標準出力に解凍します。圧縮されていないファイル全体を他のどこにも書き込みません。
ノア

+1 tksで1日が節約できます。echo "$ file"を追加します。unzip -c "$ file" | grep -q "ORA-1680"; ファイル名と結果を知るために。
マイク14

2
パイプへのストリーミングにunzip使用-pする私のバージョン!
ジバンコア

これは、すべての単一行コマンドがファイル名ではなく「標準出力」を返した場合に機能します+1
alimack

16

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

for i in *.zip
do
   zipgrep ORA-1680 "$i"
done

2
一致する場合はzipファイル名も出力する1行:for i in *.zip; do zipgrep TextToSearch $i && echo $i; done
baptx

4

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.