如何查找用户和组具有相同权限的文件

如何查找用户和组具有相同权限的文件

我想找到该用户和其他人具有相同权限的文件。我试过了ls -legrep但我不知道如何说位置 234 与位置 567 相同。

提前致谢。

答案1

注意:你的问题不清楚你是否想找到具有相同用户团体权限,或使用相同的用户其他的权限。根据您提到的模式字符串中的位置 234 和 567,我在这里假设前者 - 尽管相同的方法可以很容易地适应后者。

如果你想找到爵士,G团,和o其他(ugo)权限包括全部同样,使用以下find命令相当简单:

find . -type f \( -perm 000 -o -perm 111 -o -perm 222 -o -perm 333 -o -perm 444 -o -perm 555 -o -perm 666 -o -perm 777 \)

不幸的是,对 just 执行相同的操作需要ug做更多的工作 - 您需要测试o每对相等字节的所有 8 个可能的字节。但是,您可以使用 bash 括号扩展来构建测试ug数组,从而自动完成此操作:-perm

perms=( $(printf -- '-o -perm %s\n' {00..77..11}{0..7}) )

然后

find . -type f \( -false "${perms[@]}" \)

可能更好的方法是使用一些可以以算术方式处理模式位的东西 - 例如通过 perl 的stat函数:

find . -type f -exec perl -le '
  foreach (@ARGV) {print $_ unless (((stat)[2] & 00070) << 3 ^ (stat)[2]) & 00700}
' {} +

提取组和用户模式位并对其进行异或 - 如果它们相同,则结果为零(假)。


如果您打算通过解析文件模式的文本表示来执行此操作,那么比解析输出稍微更强大的方法ls可能是这样的:

find . -type f -printf '%m\t%p\0' | 
  gawk -v RS='\0' 'match($1,/([0-7])([0-7])/,m) && m[2] == m[1] {print $2}'

(您可以在正则表达式中使用纯文本.代替[0-7],但我觉得后者可以使意图更清晰)。

答案2

stat解决方案:

stat --format '%a %n' * | grep -E '^([0-9])\1'

或者在带有空分隔符的脚本中使用,仅获取文件名:

stat --printf '%a\t%n\0' * | grep -Ez '^([0-9])\1' | cut -z -f2-

答案3

我通常不鼓励解析ls, 但在这儿:

ls -l | sed -En '/^.(...)...\1/p'

相关内容