如何在Linux中只找到某个目录下的可执行文件?

Hai*_*ang 194 linux bash command-line find

如何在Linux中只找到某个目录下的可执行文件?

kni*_*ttl 185

可以使用-perm(不推荐)或-executable(推荐,因为它考虑了 ACL )来检查可执行文件。要使用该-executable选项:

find <dir> -executable
Run Code Online (Sandbox Code Playgroud)

如果您只想查找可执行文件而不是可搜索目录,请结合使用-type f

find <dir> -executable -type f
Run Code Online (Sandbox Code Playgroud)

  • shebang 并不意味着它们是可执行的。它只告诉我们使用哪个解释器。根据 linux 定义,“可执行文件”是设置了可执行 (x) 位的文件 (25认同)
  • `find: invalid predicate -executable'` 在 RHEL 上 (12认同)
  • 如果您有一个缺少 -executable 的旧版本 find (可能在 4.3.8 之前),请使用 find 。-烫发/u=x,g=x,o=x。 (7认同)
  • -executable 根本不是可移植的,应该避免 (5认同)
  • 哪个版本的 find 支持该类型的 -type?man 在我的系统上找到列表 b、c、d、p、f、l、s 和 D。 (3认同)
  • 同样,我的 find 也没有 `-type x`。 (2认同)

inn*_*naM 37

使用查找-perm选项。这将在当前目录中查找可由其所有者、组成员或其他人执行的文件:

find . -perm /u=x,g=x,o=x
Run Code Online (Sandbox Code Playgroud)

编辑:

我刚刚找到了至少在 GNU find 4.4.0 中存在的另一个选项:

find . -executable
Run Code Online (Sandbox Code Playgroud)

这应该会更有效,因为 ACL 也被考虑在内。

  • 那么你应该尝试现在在 GNU find: find 中不推荐使用的“-perm +”版本。-烫发 +111" (12认同)
  • 这仅适用于较新版本的 find。CentOS 默认提供的错误是 `find: invalid mode `/u=x,g=x,o=x'` (3认同)

fri*_*mle 34

我知道这个问题特别提到了 Linux,但由于它是 Google 上的第一个结果,我只想添加我正在寻找的答案(例如,如果您 - 像我现在一样 - 被您的雇主强迫使用非 GNU /Linux 系统)。

macOS 10.12.5上测试

find . -perm +111 -type f
Run Code Online (Sandbox Code Playgroud)

  • 这是我可以在 OS X 10.14 上工作的唯一变体,谢谢 (2认同)

小智 7

我有另一种方法,以防你真正想要的只是对可执行文件做一些事情——而不一定要强制 find 过滤自己:

for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done
Run Code Online (Sandbox Code Playgroud)

我更喜欢这个,因为它不依赖于-executable哪个平台特定;并且它不依赖于-perm哪个有点神秘,有点特定于平台,并且如上所述要求文件对每个人(不仅仅是你)都是可执行的。

-type f很重要,因为在 *nix 目录中必须是可执行的才能遍历,并且find命令中的查询越多,命令的内存效率就越高。

无论如何,只是提供另一种方法,因为 *nix 是十亿方法的土地。


小智 5

标记为可执行的文件不必是可执行或可加载文件或对象。

这是我使用的:

find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
    case "$(head -n 1 "$1")" in
      ?ELF*) exit 0;;
      MZ*) exit 0;;
      #!*/ocamlrun*)exit0;;
    esac
exit 1
' sh {} \; -print
Run Code Online (Sandbox Code Playgroud)

  • 这是做什么的? (2认同)
  • @nonchip我强烈不同意。 @OP 没有询问哪些文件被设置为可执行/+x,而是询问哪些文件实际上是可执行的。这意味着什么的定义留给读者,但我不会考虑 `portrait.png` 可执行文件,即使使用 `a+x`,并且我会认为 `/usr/bin/grep` 是一个可执行文件,即使它被意外更改为错过了“x”标志。 (2认同)
  • 到目前为止,您获得的反对票反映了您的信念,即您以肤浅的解释回答了错误的问题。我想知道为什么您认为 ``.so`` 文件是可执行的,但不是 ``.o`` 文件,以及为什么您认为 OCaml 脚本是可执行的,但不是 shell 脚本(或 Awk、Perl、Python 等)。另外,你的答案有一个错字。但*这个*反对票是针对尖刻、辱骂性的评论的。 (2认同)