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

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

find次のコマンドを使用する場合:

find /mydir/mysubdir -executable -type f

すべての実行可能ファイル(ディレクトリを除く)を一覧表示し、実行可能なスクリプトファイル(script.shなど)を含めます。私が望むのは、バイナリ実行可能ファイルをリストすることだけです。

答え1

このfileユーティリティを試してみてください。マニュアルページによると:

マジックテストは、特定の固定形式データを含むファイルを確認するために使用されます。一般的な例には、バイナリ実行可能ファイル(コンパイラ)a.outファイルがあり、その形式は標準インクルードディレクトリで定義されています。

正規表現を使用する必要があるかもしれませんが、

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

ファイルには多くのオプションがあるので、マニュアルページをよく見ることをお勧めします。私はgrep出力を簡単に出力するように見える最初のオプションを使用しました。

答え2

スクリプト、つまり最初の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

答え3

更新権限のない低レベルのシステムを使用する場合に備えてfind(私が書いたようにRHEL5を実行している科学クラスタがまだたくさんあります!)代わりに:

find /mypath/ -executable -type f

上記の優れた答えでは、たとえば、次のようにすることができます。

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

許可ビットを検索します。残念ながら、上記の方法はユーザーが実行可能ファイルを持つファイルのみを検索しますが、一般的に私にとっては効果的です。

答え4

私は次のツールを作成しました。ドット、あなたはこれを行うことができます。

他の方法を使用すると、一部のファイルが失われます。

関連情報