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

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

如果我使用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

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

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

答案3

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

find /mypath/ -executable -type f

在上面的优秀答案中,您可以这样做,例如,

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

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

答案4

我编写了一个工具,称为斑点,就可以做到这一点。

其他方法会丢失一些文件。

相关内容