我正在寻找您能想到的所有替代方法来列出当前目录和子目录中任何人(所有者、组、其他人)都可以执行的文件。
对于替代方法,我的意思是那些不使用 find 命令的方法:
find -L . -type f -perm -111
find -L . -type f -perm -a=x
我希望看到的一种方法是 ls 和 grep 的组合。
答案1
ls
输出通常无法可靠地进行后处理。
如果您可以保证文件名不包含换行符,您可以这样做:
ls -AlLR ./| grep -E '^-(..[[:lower:]]){3}'
这是以(仅限常规文件)开头的打印行,并且许可字段中每组 3 个字符中的第三个字符是小写字母(实际上,-
通常是x
、s
或。某些系统可能具有扩展名,但如果文件可执行,则将其设为小写字母)。l
t
请注意,它只会打印文件名,而不是其完整路径。
使用zsh
,您还可以执行以下操作:
printf '%s\n' **/*(D-.f+111)
或者:
printf '%s\n' **/*(D-.f:a+x:)
从内部bash
:
zsh -c 'printf "%s\n" **/*(D-.f+111)'
我想您正在使用-L
您的find
方法,因为对于符号链接,您想要检查符号链接的目标。这就是上面标志的目的-
。
find
但请注意, s的另一个副作用-L
是它会下降到目录的符号链接中。同样的情况也会发生在ls -LR
,而不是zsh
上面的解决方案中。如果您确实想下降到目录的符号链接,请将 替换为**
,***
如果您想避免下降到目录的符号链接find
,则使用 GNU find
(如 Ubuntu 上所示),您可以执行以下操作:
find -L . \( ! -xtype l -o -prune \) -type f -perm -111
无论如何,所有这些都无法考虑仅凭权限就可以使每个人可执行但位于不存在的目录中的文件。可搜索的被大家。如果 ACL 或其他安全措施到位,它也可能给出不正确的结果。
还要考虑可搜索性路径组件,你可以这样做:
find -L . \( ! -xtype l -perm -111 -o -prune \) -perm -111
(假设通向当前工作目录本身的所有路径组件也是 world-searchabe )
答案2
通过使用ls
和grep
:
ls -lAR | grep "^\-..x..x..x"
-l:以rwx格式显示权限。
-R:递归。