すべての圧縮ファイル内を見つけて検索する


10

ハードドライブをスキャンして、zip、gzip、bzipなどのすべての圧縮ファイルコレクションを探し、それらのコンテンツを特定のファイルタイプ(画像など)で検索したいと思います。アンチウイルスはそれをするので、私は方法があるはずだと思います。


@Rinzwindは、ファイルのリスト内ではなく、アーカイブのファイル内を検索します。含まれているが含まれてfooいないファイルが検索されますfoo.png
terdon 2015年

これは、Zip Bombを確認するのに役立ちます。+1
Sharad Gautam

回答:


18

最も簡単な方法は、アーカイブの内容をリストし、関連する拡張子のファイルを探すことです。たとえば、zipファイルの場合:

$ zip -sf foo.zip | grep -iE '\.png$|\.jpg$'
  file1.jpg
  file1.png
  file2.jpg
  file2.png

この-sfオプションはzip、アーカイブに含まれるファイルをリストするよう指示します。次に、行の終わりにgrepある.pngまたは.jpgを検索します($)。-E私たちが使用できるように、拡張正規表現を可能|とORと-i一致するケース小文字を区別しないになります。

ただし、各アーカイブツールには、内容を一覧表示するための異なるコマンドがあります。人気の高いスクリプトのほとんどを処理できるスクリプト作成ました。そのスクリプトをとして保存するとlist_compressed.sh、次のように実行できます。

list_compressed.sh | grep -iE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$'

最も一般的な画像タイプが表示されます。この方法では、ファイルの種類はファイルの拡張子によって決定できると想定しています。拡張子のない画像ファイルは検出されず、拡張子が間違っているファイルは認識されません。実際にアーカイブからファイルを抽出してfile、それぞれで実行することなく、これに対処する方法はありません。


ハードドライブ上の画像ファイルを含むすべてのアーカイブを検索たい場合は、上記を以下と組み合わせてくださいfind

find / -name '*.gz' -o -name '*.tgz' -o -name '*.zip' -print0 |
    while IFS= read -r -d '' arch; do    
        list_compressed.sh "$arch" | 
            grep -qiE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$' &&
                echo "$arch contains image(s)"
    done

findコマンドは、すべてのファイル.gz.tgzまたは.zipファイルを検索し(必要なだけ拡張機能を追加できます)、それらは私のスクリプトに渡されます。-q抑止しグレップの通常の出力、何も印刷されません。&& echo場合にのみ、アーカイブの名前が印刷されますgrep成功しました。


元の質問によると、「ハードドライブをスキャンして、zipのような、画像が含まれているすべての圧縮ファイルコレクションを探します」。あなたはアーカイブ自体の調査を手伝ってくれましたが、私はどのアーカイブに画像が含まれているかを特定したいだけです。
6ft Dan

@ 6ftDan申し訳ありませんが、私はオリジナルを見ていませんでした。投稿の意味を変えるような編集を自由にロールバックまたは再編集してください。ファイルシステム全体を検索する方法については、更新された回答を参照してください。
terdon 2015年

すばらしいですが、大文字と小文字を区別せずにgrepを実行しているので、大文字と小文字を区別せずに検索することもできますか?
kos

@kosうーん、これはに変更-nameするだけで十分簡単-inameです。ただし、それにはほとんど意味がありません。多くの圧縮プログラム(gzipなど)では、特定の拡張子が必要です。GZ動作しません。
terdon 2015年

3

terdonほど高度ではありませんが、これで十分です:

次のコードを、すべてのコードが格納されているフォルダーにfinda.sh、などの任意の名前で保存します。

for file in *.*; do
    if ( 7z l -slt "$file"> /tmp/$file.log); then
       echo $file:; cat /tmp/$file.log | grep -iE 'Path*'> $file.log && cat $file.log
    fi
done

次に、すべてのアーカイブが入っているディレクトリで実行します。これが出力です。

./finda.sh 
one.7z:
Path = one/abradabra.png
Path = one/birb.png
three.rar:
Path = three/blah.png
Path = three/qwa0g.jpg
two.zip:
Path = two/whut.png

元の質問によると、「ハードドライブをスキャンして、zipのような、画像が含まれているすべての圧縮ファイルコレクションを探します」。あなたはアーカイブ自体の調査を手伝ってくれましたが、私はどのアーカイブに画像が含まれているかを特定したいだけです。
6ft Dan

@ 6ftDanそれは可能だと思いますが、少し時間がかかるかもしれません。その間、私はスクリプトにいくつかの改善を加え、terdonの助けを借りました。
blade19899 2015年

*.*は拡張子のあるファイルにのみ一致することに注意してください。また、これにより、すべてのアーカイブ内のすべてのファイルがリストされます。ファイルの種類をテストするわけではありません。
terdon 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.