実行可能ファイルの種類を見つけるにはどうすればいいですか?

実行可能ファイルの種類を見つけるにはどうすればいいですか?

カーネルの観点から実行可能なファイルの種類を見つけたいです。私の知る限り、Linux 上の実行可能ファイルはすべて ELF ファイルです。そこで、次のことを試しました。

find * | file | grep ELF

しかし、それはうまくいきません。他のアイデアを持っている人はいますか?

答え1

後日編集: jan が必要としている機能を果たすのはこれだけです: ありがとう、huygens;

find . -exec file {} \; | grep -i elf

答え2

制限のあるシステム(組み込みシステムなど)向けの、fileとを使用しない代替ソリューション:readelf

find $WHERE -type f -exec hexdump -n 4 -e '4/1 "%2x" " {}\n"'  {} \; | grep ^7f454c46

基本的に、最初の4バイトを出力しhexdump、それをサイン. 次に、すべての種類のファイルをgrepします妖精その署名を使用します7f454c46

7fあるいは、文字を削除454cバイトはそれぞれ、、文字46なので、次のようにも使用できます。ELF

find $WHERE -type f -exec hexdump -n 4 -e '4/1 "%1_u" " {}\n"'  {} \; | grep ^delELF

また、この場合はheadの代わりにを使用することもできます。hexdump

find $WHERE -type f -exec head -c 4 {} \; -exec echo " {}" \;  | grep ^.ELF

答え3

他の方と同じように、私も回答したいと思います。私の回答も ユーティリティの使用に基づいていますfindが、他の回答とは異なるアイデアがあります。 は検索条件としても使用できるという事実に基づいています-exec。さて、このことを念頭に置いて、以前の提案をすべてこの提案にリファクタリングできます。

find /path -type f -exec sh -c "file {} | grep -Pi ': elf (32|64)-bit' > /dev/null" \; -print

grepつまり、を に移動したことになります-exec

-printこれは何をもたらすのか、と疑問に思うかもしれません。ユーティリティの やその他の柔軟性を活用できます。たとえば、出力を好みに合わせてフォーマットしたり、 を使用して出力を何らかのスクリプトにリダイレクトしたりfindできます。-print0

答え4

元の質問が妖精ファイルのみ(カーネルの観点から他の「実行可能ファイル」は含まない)の場合、find+よりも短く、おそらくより高速な代替手段がありますfile

$ scanelf -R /SEARCH/PATH
 TYPE   FILE 
ET_DYN /SEARCH/PATH/library.so
ET_EXEC /SEARCH/PATH/app1
ET_EXEC /SEARCH/PATH/app2

ELF ファイルを再帰的に検索し、それぞれのオブジェクト ファイル タイプとファイル パスを出力します。

検索を実行可能な ELF ファイルのみに絞り込みます: scanelf -EET_EXEC -R /SEARCH/PATH

バナーとタイプを抑制し、ファイルパスのみを保持します: scanelf -EET_EXEC -RBF %F /SEARCH/PATH

関連情報