我想找到该用户和其他人具有相同权限的文件。我试过了ls -l
,egrep
但我不知道如何说位置 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'