Answers:
您可以尝试使用该file
实用程序。根据联机帮助页:
魔术测试用于检查带有特定固定格式数据的文件。一个典型的示例是一个二进制可执行文件(编译程序)a.out文件,其格式在中定义,并且可能在标准include目录中定义。
您可能需要使用正则表达式,但是类似:
$ find -type f -executable -exec file -i '{}' \; | grep 'x-executable; charset=binary'
该文件具有很多选项,因此您可能需要仔细阅读手册页。我使用的第一个选项似乎可以轻松输出grep输出。
find -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print
。它只会给您文件(因此可以传递给他要运行的下一个命令)
find
使用brew install findutils
或来安装GNU ,sudo port install findutils
然后可以运行类似的调用,以达到类似的效果:gfind . -type f -executable -exec file '{}' \; | grep -i execut
这是一种排除脚本的方法,即前两个字符为的文件#!
:
find -type f -executable -exec sh -c 'test "$(head -c 2 "$1")" != "#!"' sh {} \; -print
对于某些类型的文件,尚不清楚是否要将它们分类为脚本或二进制文件,例如字节码文件。根据事物的设置方式,这些事物可能以或不以开头#!
。如果这些对您来说很重要,则必须使内部Shell脚本更复杂。例如,这是您可能包括ELF二进制文件和Mono可执行文件以及Objective Caml字节码程序的方法,但不包括其他类型的可执行文件,例如shell脚本或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