查找中的 -perm 标志

查找中的 -perm 标志

我正在尝试理解这个命令:

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将匹配设置了该正确位的所有文件,(这意味着07721752...如果该文件可供其他人写入,则无论其组合如何)

答案3

  • -a: 是逻辑AND(-o可用于OR)
  • \(, \): 因为括号在 shell 中有特殊含义,所以使用斜杠来转义它们
  • 四位数的权限与sticky bit, setuid,setgid

相关内容