it-swarm.cn

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

如果我这样使用find命令:

find /mydir/mysubdir -executable -type f

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

48
uray

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

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

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

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

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

45
Steven D

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

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

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

find /mypath/ -executable -type f

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

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

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

2
TomRoche