使用 find命令搜索可执行文件

什么类型的参数 / 标志可以与 Unix 使用find命令,以便我搜索可执行文件?

什么类型的参数 / 标志可以与 Unix 使用find命令,以便我搜索可执行文件?

251

在 GNU 版本的 find 上可以使用-executable

find . -type f -executable -print

对于 BSD 版本的 find,您可以将-perm+和八进制掩码一起使用:

find . -type f -perm +111 -print

在该上下文中,“+”意味着“这些位中的任何位被设置”,并且 111 是执行位。

请注意,这与 GNU find 中的-executable谓词不同。特别是,-executable测试文件是否可以由当前用户执行,而-perm +111只是测试是否设置了任何执行权限。

旧版本的 GNU find 也支持-perm +111语法,但从4.5.12开始,此语法不再受支持。相反,您可以使用-perm /111来获取此行为。

52

向 @gniourf_gniourf致敬,以消除基本的误解。

这个答案试图提供现有答案的概述,并讨论它们的微妙之处相对优点,以及提供背景信息,特别是关于可移植性

查找可执行文件可以参考两个不同的用例

以用户为中心:查找当前用户可执行的文件

以文件为中心:查找具有(一个或多个)可执行权限位的文件。

请注意,在场景中,使用find -L ...而不是find ...可能是有意义的,以便也找到可执行文件的符号链接

请注意,最简单的以文件为中心的情况-查找具有为所有三个安全主体(用户,组,其他)设置的可执行权限位的可执行文件-通常,但不一定产生与以用户为中心的场景相同的结果-了解差异很重要。

以用户为中心 (-executable)

accepted answer推荐-executable,如果GNUfind可用。

GNUfind附带大多数Linux发行版

相比之下,基于 BSD 的平台,包括 macOS,都带有 BSD find,功能较弱。

根据场景要求,-executable仅匹配当前用户可以执行的文件(有边缘情况。[1])。

接受答案 (-perm +111)提供的BSDfind替代方案回答了一个不同的以文件为中心的问题(如答案本身所述)。

仅使用-perm来回答以用户为中心的问题是不可能的,因为所需要的是文件的用户和组标识与当前用户的实用程序相关联,而-perm只能测试
文件的

因此,最好的情况-perm可以做的(本身)是近似值-executable也许比-perm +111更接近近似值-perm -111,以便找到具有可执行位的文件设置为所有其他安全主体(用户组,它)

find . -type f -perm -111  # or: find . -type f -perm -a=x

gniourf_gniourf's answer使用-exec test -x {} \;提供了真正的,可移植的-executable,尽管以性能为代价

-exec test -x {} \;-perm +111(即,具有至少一个可执行位集的文件)组合可能有助于性能,因为exec不需要为每个文件调用(以下使用与 POSIX 兼容的 BSD 的等效项查找-perm +111/

find . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \) -exec test -x {} \; -print

以文件为中心 (-perm)

回答以文件为中心的问题,使用符合 POSIX 的-permprimary(在 GNU find 术语中称为test

就足够了。

-perm允许您测试任何文件权限,而不仅仅是可执行性。

权限被指定为八进制符号模式。八进制模式是八进制数(例如,111),而符号模式是字符串(例如,a=x)。

符号模式将安全主体标识为u(用户),g(组)和o(其他),或a以引用所有这三个。例如,对于可执行文件,权限表示为x,并使用运算符a分配给

find的上下文中:

使用-作为模式的前缀(例如,-ug=x)表示:匹配具有所有权限的文件指定(但匹配的文件可能具有其他权限)。

具有NO 前缀(例如755)表示:匹配具有此完整,精确权限集的文件。

警告GNU find 和 BSD find都实现了附加的非标准前缀,其中是指定的权限位集合逻辑中的任何一个,但使用不兼容的语法

BSD 查找:+

GNU find:/[2]

因此,避免这些扩展,如果你的代码必须是可移植的

下面的示例演示了各种以文件为中心的问题的可移植答案。

以文件为中心的命令示例

注:

下面的示例是 POSIX 兼容的,这意味着它们应该在任何 POSIX 兼容的实现中工作,包括 GNU find 和 BSD find;具体来说,这需要:

不使用非标准模式前缀+/

使用逻辑运算符 primaries的 POSIX 形式:

!表示 NOT(GNU find 和 BSD find 也允许-not);请注意,示例中使用了\!,以保护!免受 shell 历史扩展

-a表示 AND(GNU find 和 BSD find 也允许-and

-o表示 OR(GNU find 和 BSD find 也允许-or

这些示例使用符号模式,因为它们更易于阅读和记忆。

使用模式前缀-=+运算符可以互换使用(例如,-u=x等同于-u+x-除非您稍后应用-x,但这样做没有意义)。

使用,连接部分模式;AND 逻辑是隐含的;例如,-u=x,g=x表示必须设置用户组的可执行位。

模式不能本身表示“仅在未设置此位时匹配”意义上的负匹配;您必须使用单独的-perm表达式和 NOT primary!

请注意,find 的primaries(例如-print-perm;在 GNU find 中也称为actionstests)是隐式-a(逻辑 AND)连接的,并且-o

find -L ...而不仅仅是find ...用于匹配符号链接到可执行文件

-L指示 find 评估符号链接的目标,而不是符号链接本身;因此,如果没有-L-type f将完全忽略符号链接。

# Match files that have ALL executable bits set - for ALL 3 security
# prinls (u (user), g (group), o (others)) and are therefore executable
# by *anyone*.
# This is the typical case, and applies to executables in _system_ locations
# (e.g., /bin) and user-installed executables in _shared_ locations
# (e.g., /usr/local/bin), for instance. 
find -L . -type f -perm -a=x  # -a=x is the same as -ugo=x
# The POSIX-compliant equivalent of `-perm +111` from the accepted answer:
# Match files that have ANY executable bit set.
# Note the need to group the permission tests using parentheses.
find -L . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \)
# A somewhat contrived example to demonstrate the use of a multi-principial
# mode (comma-separated clauses) and negation:
# Match files that have _both_ the user and group executable bit set, while
# also _not_ having the other executable bit set.
find -L . -type f -perm -u=x,g=x  \! -perm -o=x

[1] 从man find到 GNU find 4.4.2 的-executable的描述:

匹配可执行的文件和可搜索的目录 (在文件名解析意义上)。这考虑了访问控制列表和-perm 测试忽略的其他权限假象。该测试利用了 access (2) 系统调用,因此可能被执行 UID 映射 (或 root-squashing) 的 NFS 服务器所欺骗,因为许多系统在客户端内核中实现了 access (2),因此实际上不能利用该访问 (2) 服务器上的信息。

[2] GNU 查找版本也允许前缀+,但这首先被弃用并最终被删除,因为将+符号模式结合使用可能会产生意想不到的结果,因为它被解释为精确之前

13

以便有另一种可能性1找到当前用户可执行的文件:

find . -type f -exec test -x {} \; -print

(这里的测试命令是在 PATH 中找到的,很可能是/usr/bin/test,而不是内置的)。

1仅在find-executable标志不可用时使用此选项!这与-perm +111解决方案略有不同。

11

您可以使用-executable测试标志:

-executable
              Matches files which are executable  and  directories  which  are
              searchable  (in  a file name resolution sense).

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(97)
在 LateX中更改引文样式
上一篇
更新内部应用程序-iOS企业开发人员计划
下一篇

相关推荐

  • 如何计算等边三角形的坐标 (how to find the height of an equilateral triangle)

    目标是使用等边三角形,正方形或六边形来镶嵌一个平面,由从文件中读取的整数确定。边长也是通过从文件中读取整数给出的。我已经为正方形做了,但是三角形让我困惑。我一直在尝试使用drawPolygon。我假设边长将与从点 a 到点 b 到点 c 的距离相关,但我真的没有线索…

    2022-11-28 12:50:20
    0 16 27
  • win10专业版ios下载实现最佳的操作体验

    Windows 10专业版iOS下载可以通过以下步骤完成:访问 官方网站,下载 Windows 专业版的 ISO 文件。…

    2023-05-25 07:32:24
    0 49 17
  • win10鼠标样式:Win10 全新鼠标体验,让你的操作更加便捷!

    Windows 10鼠标样式是一种可以改变指针形状的特殊功能,它使用户可以自定义指针的外观,以便更好地满足个性化需求。要更改Windows 10鼠标样式,可以使用以下代码:…

    2023-04-22 07:30:35
    0 32 62
  • intothedead2破解版iosiOS版的无限游戏乐趣

    Into the Dead 2破解版iOS的破解代码如下:打开Cydia,然后搜索“Into the Dead Hack”,安装它。…

    2023-01-14 06:21:54
    0 32 99
  • winrar ios版全新压缩解压体验,让您的文件管理更加便捷!

    WinRAR iOS版是一款专为iOS设备打造的压缩工具,可以帮助用户将文件压缩成.rar格式,从而减少文件大小,便于传输和存储。它还可以解压缩.rar、.zip、.tar、.gz、.bz2等格式的文件,并支持文件加密功能。…

    2023-01-10 15:02:30
    0 31 55
  • win10原版ios:探索Win10原版iOS的新体验

    Win10原版iOS是微软在Windows 10操作系统上推出的一种用户界面,它采用了iOS设计风格,以提供更加简洁、清新的用户体验。它的主要特点包括:…

    2023-05-03 01:18:10
    0 64 21
  • Ios手柄游戏厅:蓝牙 Arduino游戏手柄

    关于Ios手柄游戏厅的问题,在arduino usb game controller中经常遇到,我正在尝试制作一个带有 2 个模拟棒和 16 个按钮的自定义蓝牙控制器,使用 RN-42XV 蓝牙芯片和 arduino,我可以将其与 android 和 Windows PC 一起使用。到目前为止,我已经成功地将 arduino leonardo 编码为具有 2 个模拟棒和 16 个按钮的游戏板,但是当我无法使用我的 RN-42XV bluetooth 按钮将 arduino 显示为 42…

    2022-11-27 15:19:05
    0 86 75
  • 小程序测试工具:UI测试工具(ui testing tools)

    关于小程序测试工具的问题,在ui testing tools中经常遇到,寻找 Windows(.NET WinForms)应用程序的 UI 测试工具。这个想法是,分析师将通过一些 UI 记录测试,它将能够一遍又一遍地播放。…

    2022-11-25 00:22:02
    0 23 25

发表评论

登录 后才能评论

评论列表(3条)