我正在尝试理解这个命令:
find /home/ -type d \( -perm -0002 -a ! -perm -1000 \) 2>/dev/null
我知道它将在“主”目录中查找所有目录并将所有 stderr 消息重定向到一个文件(以抑制它们),但是我对中间的部分感到困惑,特别是:
\( -perm -0002 -a ! -perm -1000 \)
斜杠是什么意思?我假设! -perm -1000
表示查找没有这些权限的目录,-perm -0002
表示查找具有这些权限的目录,但我只习惯于看到 644 格式的权限(例如)。为什么有四位数字?另外,标志有什么用-a
?
答案1
在 中-type d \( -perm -0002 -a ! -perm -1000 \)
,首先,斜杠转义了 shell 的括号,因此它们可以作为参数传递,而不是被 shell 解释为特殊运算符。 (出于显而易见的原因,您需要相同的例如>
。)它们也可以写为'('
或"("
,但最终find
只能看到(
和)
。
括号将条件分组,并且-a
是和连词。这也是背靠背条件的隐式默认值,就像这里使用的 with-type d
和 括号中的表达式一样,没有显式-a
连接它们。该表达式完全等同于-type d -perm -0002 ! -perm -1000
.实际上只需要括号或者连词-o
.
-type d
很明显,意味着寻找一个文件-perm -NNNN
全部设置的权限位NNNN
。或者,在这种情况下,目录0002
设置了“为他人写”权限 ( ),并且未设置粘性位 ( 1000
)(因为否定)。我想这里的组合也可以写成-perm -o+w ! -perm -o+t
。请注意权限字符串前面的破折号,如果没有它,含义会有所不同。参见例如Linux 的 find 手册页,查找“( expr )”和“-perm 模式”。
对目录的写访问允许在其中创建、删除和重命名文件,粘滞位可防止删除和重命名其他用户拥有的文件。整个表达式查找任何人都可以删除或重命名任何文件的目录。
答案2
在里面手动的你可以找到:
Operators
Operators join together the other items within the expression.
They include for example -o (meaning logical OR) and -a
(meaning logical AND). Where an operator is missing, -a is
assumed.
所以字面\( -perm -0002 -a ! -perm -1000 \)
意思是:perm = 0002 而不是 perm = 1000
perm = 0002 表示其他人可写
perm = 1000 表示设置了粘滞位。
所以这个表达式搜索其他可写且没有粘性位集的文件。
查找目录是通过-type d
d
手段目录完成的,因此查找查找目录类型的对象
从find手册来看,-perm
有几种形式:
-perm 0002
将匹配具有此确切权限设置的所有文件-perm -0002
将匹配设置了该正确位的所有文件,(这意味着0772
,1752
...如果该文件可供其他人写入,则无论其组合如何)
答案3
-a
: 是逻辑AND(-o
可用于OR)\(
,\)
: 因为括号在 shell 中有特殊含义,所以使用斜杠来转义它们- 四位数的权限与
sticky bit
,setuid
,setgid