ディレクトリ内ですべてのバイナリ実行可能ファイルを再帰的に見つける方法は?


46

findこのようなコマンドを使用する場合:

find /mydir/mysubdir -executable -type f

すべての実行可能ファイルがリストされ(ディレクトリを除く)、実行可能スクリプトファイル(script.shなど)が含まれます。私がやりたいのは、バイナリ実行可能ファイルのみをリストすることです。


1
件名を変更して、質問に答える鍵となる単語「binary」を含めてください。
ステファンLasiewski

回答:


44

fileユーティリティを試すことができます。マンページによると:

マジックテストは、特定の固定形式のデータを含むファイルをチェックするために使用されます。これの標準的な例は、バイナリ実行可能ファイル(コンパイル済みプログラム)a.outファイルで、その形式はで定義され、場合によっては標準のincludeディレクトリに定義されています。

正規表現を試してみる必要があるかもしれませんが、次のようなものです。

$ find -type f -executable -exec file -i '{}' \; | grep 'x-executable; charset=binary'

ファイルには多くのオプションがありますので、manページをよく見てください。私が見つけた最初のオプションを使用しました。


15
useと言いますfind -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print。それだけで、あなたがファイルを提供します(したがって、彼が実行したいと考え、次のコマンドに渡すことができます)
ゲルト

serverfault.com/a/584595/211551ソリューションは、実行可能とマークされていないが実行可能なファイルを検出します。
user2067125

OS Xでは、またはを使用してGNU findをインストールし、同様の効果を得るために次のような呼び出しを実行できますbrew install findutilssudo port install findutilsgfind . -type f -executable -exec file '{}' \; | grep -i execut
。– GDP2

7

スクリプト、つまり最初の2文字が次のファイルであるファイルを除外する方法は#!次のとおりです。

find -type f -executable -exec sh -c 'test "$(head -c 2 "$1")" != "#!"' sh {} \; -print

一部の種類のファイルでは、バイトコードファイルなど、スクリプトとして分類するのかバイナリとして分類するのかが明確ではありません。物事がどのように設定されているかに応じて、これらはで始まる場合とそうでない場合があり#!ます。これらが問題になる場合は、内部シェルスクリプトをより複雑にする必要があります。たとえば、ELFバイナリ、Mono実行可能ファイル、Objective Camlバイトコードプログラムを含める方法を示しますが、シェルスクリプトやperlスクリプト、JVMバイトコードプログラムなどの他の種類の実行可能ファイルは含めません。

find -type f -executable -exec sh -c '
    case "$(head -n 1 "$1")" in
       ?ELF*) exit 0;;
       MZ*) exit 0;;
       #!*/ocamlrun*) exit 0;;
    esac
    exit 1
' sh {} \; -print

2

ダウンレベルfind(まだ書いているように、RHEL5を実行するたくさんの科学クラスターがあります!)

find /mypath/ -executable -type f

上記の優れた回答では、次のことができます。

find /mypath/h -type f -perm -u+x

許可ビットで検索します。残念ながら、上記はユーザーが実行可能なファイルのみを検索しますが、それは通常私のために機能します。


これにより、バイナリだけでなく、実行可能スクリプトも検出されます。
クサラナナンダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.