
カーネルの観点から実行可能なファイルの種類を見つけたいです。私の知る限り、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
あるいは、文字を削除、45
、4c
バイトはそれぞれ、、文字46
なので、次のようにも使用できます。E
L
F
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
。