如何在目录中递归查找所有二进制可执行文件?


46

如果我使用这样的find命令:

find /mydir/mysubdir -executable -type f

列出了所有可执行文件(不包括目录),包括可执行脚本文件(如script.sh等)。我想做的是仅列出二进制可执行文件。


1
请更改主题以包括“二进制”一词,这是回答您的问题的关键。
Stefan Lasiewski'9

Answers:


44

您可以尝试使用该file实用程序。根据联机帮助页:

魔术测试用于检查带有特定固定格式数据的文件。一个典型的示例是一个二进制可执行文件(编译程序)a.out文件,其格式在中定义,并且可能在标准include目录中定义。

您可能需要使用正则表达式,但是类似:

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

该文件具有很多选项,因此您可能需要仔细阅读手册页。我使用的第一个选项似乎可以轻松输出grep输出。


15
我会说用find -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print。它只会给您文件(因此可以传递给他要运行的下一个命令)
Gert 10'2

serverfault.com/a/584595/211551解决方案可找到未标记为可执行但可执行的文件。
user2067125

在OS X上,您可以find使用brew install findutils或来安装GNU ,sudo port install findutils然后可以运行类似的调用,以达到类似的效果:gfind . -type f -executable -exec file '{}' \; | grep -i execut
GDP2

7

这是一种排除脚本的方法,即前两个字符为的文件#!

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

2

万一您发现自己的系统级别较低find(如我所写,仍有运行RHEL5的Lotta科学集群!)而没有更新权限:

find /mypath/ -executable -type f

在上述出色的答案中,您可以执行以下操作:

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

搜索权限位。不幸的是,以上方法仅找到用户具有可执行文件的文件,但这通常对我有用。


这仍然会找到可执行脚本,而不仅仅是二进制文件。
库桑兰达
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.