カーネルの観点から実行可能なファイルタイプを見つけたい。私の知る限り、Linuxのすべての実行可能ファイルはELFファイルです。したがって、私は以下を試しました:
find * | file | grep ELF
ただし、これは機能しません。誰か他のアイデアはありますか?
後で編集:この1つだけがjanに必要なことを行います。
find . -exec file {} \; | grep -i elf
find
の-executable
フラグをご覧ください。
バイナリ実行可能ファイルはそのタイプのファイルに属しているため、最初に通常のファイルを探します。
次に、通常のファイルごとにMIMEタイプを要求し、それがapplication/x-executableと一致する場合、それはバイナリ実行可能ファイルです(Linux実行可能ファイルと一致する必要があり、たとえばWindowsはapplication/x-dosexecと一致します)。
find . -type f -print0 | xargs -0 -n 10 file -i | grep "application/x-executable"
このコマンドを試してみましたが、find . -type f -print0 | xargs -0 -n 10 file | grep -w ELF
。コマンドfile
はバグがあり、ELF実行可能ファイルをELF共有オブジェクトとして検出するようです。したがって、コマンドは理論的には正しいものの、実際には不完全です。
したがって、ELF実行可能ファイルと共有オブジェクトを探す必要がありますが、*。soおよび。so。という名前のすべてのファイルを除外します
find . -type f ! \( -name "*.so.*" -o -name "*.so" \) -print0 | xargs -0 -n 10 file -i | egrep "application\/x-sharedlib|application\/x-executable"
それはおそらく完璧ではありませんが、それはかなり近いです。
他の人のように、私も答えたいです。私の回答もfind
ユーティリティの使用に基づいていますが、他の回答とは異なる考えがあります。その事実に基づいて、-exec
も検索条件として使用できます。これを念頭に置いて、これまでの提案をすべてこれにリファクタリングできます。
find /path -type f -exec sh -c "file {} | grep -Pi ': elf (32|64)-bit' > /dev/null" \; -print
つまりgrep
を-exec
に移動しました。
これは私たちに何を与えますか、あなたは尋ねるかもしれませんか? -print
およびfind
ユーティリティのその他の柔軟性を使用できます。たとえば、好みに応じて出力をフォーマットしたり、-print0
を使用して出力をスクリプトなどにリダイレクトしたりできます。
私は、各一致にelfヘッダーがあることを確認することによってバイナリ実行可能ファイルを見つけることが目的であった場合、これが元の質問に答えると思います。
タイプ-executable
に基づいてファイルを前処理し、明示的にexecutable
であるヘッダーに一致するgrepにパイプするreadelf -l
を呼び出す別のシェルを介して結果を実行します。このテストに合格したものはすべて、出力のためにprintf
に渡されます。
pwd
ビットはフルパスを出力します。
find `pwd` -type f -executable -exec sh -c 'readelf -l "$1" 2>/dev/null | grep -qio 'executable' && printf "$1\n"' -- {} \;