回答:
file
ユーティリティを試すことができます。マンページによると:
マジックテストは、特定の固定形式のデータを含むファイルをチェックするために使用されます。これの標準的な例は、バイナリ実行可能ファイル(コンパイル済みプログラム)a.outファイルで、その形式はで定義され、場合によっては標準のincludeディレクトリに定義されています。
正規表現を試してみる必要があるかもしれませんが、次のようなものです。
$ find -type f -executable -exec file -i '{}' \; | grep 'x-executable; charset=binary'
ファイルには多くのオプションがありますので、manページをよく見てください。私が見つけた最初のオプションを使用しました。
find -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print
。それだけで、あなたがファイルを提供します(したがって、彼が実行したいと考え、次のコマンドに渡すことができます)
find
をインストールし、同様の効果を得るために次のような呼び出しを実行できますbrew install findutils
sudo port install findutils
gfind . -type f -executable -exec file '{}' \; | grep -i execut
スクリプト、つまり最初の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