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

在 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
来获取此行为。
向 @gniourf_gniourf致敬,以消除基本的误解。
这个答案试图提供现有答案的概述,并讨论它们的微妙之处和相对优点,以及提供背景信息,特别是关于可移植性。
查找可执行文件可以参考两个不同的用例:
以用户为中心:查找当前用户可执行的文件。
以文件为中心:查找具有(一个或多个)可执行权限位集的文件。
请注意,在场景中,使用find -L ...
而不是find ...
可能是有意义的,以便也找到到可执行文件的符号链接。
请注意,最简单的以文件为中心的情况-查找具有为所有三个安全主体(用户,组,其他)设置的可执行权限位的可执行文件-通常,但不一定产生与以用户为中心的场景相同的结果-了解差异很重要。
以用户为中心 (-executable
)
accepted answer推荐-executable
,如果GNUfind
可用。
GNUfind
附带大多数Linux发行版
相比之下,基于 BSD 的平台,包括 macOS,都带有 BSD find,功能较弱。
根据场景要求,-executable
仅匹配当前用户可以执行的文件(有边缘情况。[1])。
接受答案 (-perm +111
)提供的BSDfind
替代方案回答了一个不同的,以文件为中心的问题(如答案本身所述)。
仅使用 因此,最好的情况 gniourf_gniourf's answer使用 将 要回答以文件为中心的问题,使用符合 POSIX 的-perm
来回答以用户为中心的问题是不可能的,因为所需要的是将文件的用户和组标识与当前用户的实用程序相关联,而-perm
只能测试
文件的
-perm
可以做的(本身)是近似值-executable
。也许比-perm +111
更接近近似值-perm -111
,以便找到具有可执行位的文件设置为所有其他安全主体(用户组,它)find . -type f -perm -111 # or: find . -type f -perm -a=x
-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
)-perm
primary(在 GNU find 术语中称为test)
-perm
允许您测试任何文件权限,而不仅仅是可执行性。
权限被指定为八进制或符号模式。八进制模式是八进制数(例如,111
),而符号模式是字符串(例如,a=x
)。
符号模式将安全主体标识为u
(用户),g
(组)和o
(其他),或a
以引用所有这三个。例如,对于可执行文件,权限表示为x
,并使用运算符a分配给
在find
的上下文中:
使用-
作为模式的前缀(例如,-ug=x
)表示:匹配具有所有权限的文件指定(但匹配的文件可能具有其他权限)。
具有NO 前缀(例如755
)表示:匹配具有此完整,精确权限集的文件。
警告:GNU find 和 BSD find都实现了附加的非标准前缀,其中是指定的权限位集合逻辑中的任何一个,但使用不兼容的语法:
BSD 查找:+
/
[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 中也称为actions和tests)是隐式与-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 查找版本也允许前缀+
,但这首先被弃用并最终被删除,因为将+
与符号模式结合使用可能会产生意想不到的结果,因为它被解释为精确在之前
以便有另一种可能性1找到当前用户可执行的文件:
find . -type f -exec test -x {} \; -print
(这里的测试命令是在 PATH 中找到的,很可能是/usr/bin/test
,而不是内置的)。
1仅在find
的-executable
标志不可用时使用此选项!这与-perm +111
解决方案略有不同。
您可以使用-executable
测试标志:
-executable
Matches files which are executable and directories which are
searchable (in a file name resolution sense).
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(3条)