ハードドライブをスキャンして、zip、gzip、bzipなどのすべての圧縮ファイルコレクションを探し、それらのコンテンツを特定のファイルタイプ(画像など)で検索したいと思います。アンチウイルスはそれをするので、私は方法があるはずだと思います。
ハードドライブをスキャンして、zip、gzip、bzipなどのすべての圧縮ファイルコレクションを探し、それらのコンテンツを特定のファイルタイプ(画像など)で検索したいと思います。アンチウイルスはそれをするので、私は方法があるはずだと思います。
回答:
最も簡単な方法は、アーカイブの内容をリストし、関連する拡張子のファイルを探すことです。たとえば、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
成功しました。
-name
するだけで十分簡単-iname
です。ただし、それにはほとんど意味がありません。多くの圧縮プログラム(gzipなど)では、特定の拡張子が必要です。GZ
動作しません。
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
*.*
は拡張子のあるファイルにのみ一致することに注意してください。また、これにより、すべてのアーカイブ内のすべてのファイルがリストされます。ファイルの種類をテストするわけではありません。
foo
いないファイルが検索されますfoo.png
。