Linux文件权限的正则表达式(数字表示法)

8

我真的想不出来这个问题的正确正则表达式。

我正在寻找一个可以匹配Linux文件权限的有效数字表示的正则表达式(例如,740代表所有读取无,777代表所有-所有-所有)。到目前为止,我尝试了以下内容:

strtotest=740
echo "$strtotest" | grep -q "[(0|1|2|3|4|5|7){3}]"
if [ $? -eq 0 ]; then
    echo "found it"
fi

上述问题在于正则表达式会匹配任何带有1-57的字符,而不考虑其他字符。例如,如果将strtotest更改为709,条件将为真。我还尝试过使用[0|1|2|3|4|5|7{3}][(0|1|2|3|4|5|7{3})],但这些都不太行。

我的正则表达式是否有误,或者我缺少与grep有关的内容?

4个回答

7
您需要的可能是:

您需要的可能是

grep -Eq "[0-7]{3}"

编辑: 如果您想使用此功能查找具有特定权限的文件,您应该更好地查看find-perm)或stat


谢谢。我正在做这个作为一个学习练习。我正在使用它在一个BASH shell中,当执行并提供权限时,将更改其内所有文件和子目录的权限为给定的权限。 - Sho Kei

6

最简单和最明显的正则表达式是:

grep -q '(0|1|2|3|4|5|7)(0|1|2|3|4|5|7)(0|1|2|3|4|5|7)'

这里是优化后的版本:
grep -Eq '(0|1|2|3|4|5|7){3}'

由于数字6也可以表示权限,因此我们可以进一步进行优化:

grep -Eq '[0-7]{3}'

谢谢!这个完美地解决了我的问题。我希望我能够给一些人点赞,但我想我需要在这个网站上更活跃一些才行 :P - Sho Kei
你在答案中发布的 grep -Eq "[(0|1|2|3|4|5|7)]{3}"(以及它更长的表亲)实际上是不正确的。 [ ] 定义了一个范围,因此你的正则表达式将匹配例如 ||977) 等等。 - doubleDown
更正了正则表达式,因为这是被接受的答案,并且最有可能被看到的答案。 - OmnipotentEntity

3
您的正则表达式非常错误: [ ]定义了一个范围,其中的所有字符都在允许的集合中。
grep有一些额外的引用规则,可能需要额外的\
grep在每行中搜索您的正则表达式 - 如果您只想在行的开头匹配,则需要将^作为正则表达式中的第一个字符,如果您想匹配到行末,则需要在正则表达式的末尾使用$

哦,我的失误。我错误地认为括号是grep在正则表达式中所需的内容。 - Sho Kei

1

仅供参考,您可以在Bash中使用shell模式来完成它

if [[ $strtotest == [0-7][0-7][0-7] ]]; then
    echo "Found it"
fi

+1 是为了解决正则表达式的问题和消除对 $?的显式比较。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接