バイナリファイルをディレクトリで検索する必要があります。これをファイルで実行したいので、結果をgrepで確認します。しかし、私の問題は、バイナリファイルが何であるかわからないことです。バイナリファイルにfileコマンドを与えるもの、またはgrepで何をチェックする必要がありますか?
ただ言及する必要がありますPerlの-T
テキストファイルとその反対のテスト-B
バイナリファイル。
$ find . -type f | Perl -lne 'print if -B'
見たバイナリファイルを出力します。使用する -T
逆の場合:テキストファイル。
最初の1,000文字程度しか表示されないため、完全に万能というわけではありませんが、ここで提案されているいくつかのアドホックな方法よりも優れています。全体の概要についてはman perlfuncを参照してください。ここに要約があります:
「-T」および「-B」スイッチは次のように機能します。ファイルの最初のブロックなどが検査され、非ASCII文字を含む有効なUTF-8であるかどうかが確認されます。もしそうなら、それは「-T」ファイルです。それ以外の場合は、ファイルの同じ部分で、奇妙な制御コードや高ビットセットの文字などの奇数文字が検査されます。 3分の1を超える文字が奇妙な場合は、「-B」ファイルです。それ以外の場合は「-T」ファイルです。また、検査された部分にゼロバイトを含むファイルは、バイナリファイルと見なされます。
これにより、すべての非テキストベースのバイナリファイルおよび空のファイルが検索されます。
grep
のみのソリューション(Mehrdadのコメントから):
grep -r -I -L .
これには、find
およびgrep
以外のツールは必要ありません。
find . -type f -exec grep -IL . "{}" \;
-I
はバイナリファイルを不一致と見なすようにgrepに指示します
-L
一致しないファイルのみを印刷します
.
はその他すべてに一致します
これにより、空でないすべてのバイナリファイルが検索されます。
find . -type f ! -size 0 -exec grep -IL . "{}" \;
これは課題なので、完全な解決策を提供した場合、おそらく私を憎むでしょう;-)だから、ここに少しのヒントがあります:
空でないファイルに一致する.
のような正規表現を検索すると、grep
コマンドはデフォルトでバイナリファイルのリストを出力します。
grep . *
出力:
[...]
Binary file c matches
Binary file e matches
awk
を使用してファイル名のみを取得し、ls
を使用して権限を出力できます。それぞれのマニュアルページ(man grep
、man awk
、man ls
)を参照してください。
質問への私の最初の回答は、find
コマンドを使用してここでかなりインラインになりました。あなたの講師はあなたをmagic numbers
file
コマンドを使用して、複数のタイプに分解します。
私の目的では、それは次のように単純でした。
file * | grep executable
しかし、それは多くの方法で行うことができます。
Linuxのバイナリファイルの形式はELF
です。
バイナリファイルでfile
コマンドを実行すると、出力にはWord ELF
が含まれます。これをgrepできます。
コマンドラインで:
file <binary_file_name>