![如何在目录中递归查找所有二进制可执行文件?](https://linux22.com/image/367/%E5%A6%82%E4%BD%95%E5%9C%A8%E7%9B%AE%E5%BD%95%E4%B8%AD%E9%80%92%E5%BD%92%E6%9F%A5%E6%89%BE%E6%89%80%E6%9C%89%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%EF%BC%9F.png)
如果我使用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
我编写了一个工具,称为斑点,就可以做到这一点。
其他方法会丢失一些文件。