在 Linux 上使用 find 查找具有匹配的组/其他权限的文件

在 Linux 上使用 find 查找具有匹配的组/其他权限的文件

我需要在目录中查找组和其他权限匹配的所有文件(例如,文件的组成员身份实际上并不影响访问的文件)。

由于只有 8 种可能性(x00、x11、x22 等),我认为我可以只搜索这些权限,但我找不到一种方法来明确匹配某些权限位而不匹配所有权限位(例如,对于 x00,匹配 000、100、200、300 等全部)。

我已经建立了一个很长的 find 语句,例如:

find . \( \ -perm 000 -o -perm 011 -o -perm 022 -o -perm 033 [...] \ -perm 100 -o -perm 111 -o -perm 122 -o -perm 133 [...] \ [...] \) -ls

它可以工作,但是看起来很不雅观(它超过 8 个字符...而且那是在我放置任何需要的路径选择子句之前...)。

有没有更好的办法?

编辑:我刚刚想到这会忽略 SUID/SGID 权限。添加这些权限会使命令更长...希望有更好的方法!

答案1

好吧,我仍然不确定我是否理解了这个问题(可能不是你的错!),但这里有一些想法:

1)使用-print0选项(以及、等find中的类似选项)来处理文件名中的特殊字符。grepxargs

2)可能需要一些脚本来把所有东西组合在一起,但是统计命令将返回文件的八进制权限字符串。然后,您要做的就是将其拆分为三个单独的字符(例如 775 -> 7 7 5)(使用 bash 参数修饰符或您选择的语言/工具中的字符串处理),如果第二个或第三个字符与第一个字符匹配,则您对所有者和组或其他人的权限相同。

此处的改进是,您可以同时查看所有三个权限,而不必枚举所有排列。它们要么是相同的三元组,要么不是。处理长度超过 3 个字符的权限字符串(例如粘性位等)需要更多操作,但它仍然基本上是一个相等或不相等的测试来查找相关文件。

我没有时间去弄清楚细节,但我会首先看看我是否可以编写一个脚本来:

1) 使用 获取并分解权限stat,然后检查是否有权限匹配。如果有,则打印文件名(可能是完整路径)以及需要更改的权限或标志。如果没有,则丢弃该文件名。

2)将输出通过管道传输find到此脚本或使用find -exec选项访问它。

3)然后,您将获得需要修改的文件列表以及每个文件所需的内容,并且可以通过简单的脚本进行处理。

相关内容