我阅读了手册页,find
但我并不清楚。
find -perm -mode
------>至少必须设置这些位才能使文件匹配
例如:find -perm -754
找到 754,755,757,774,777
那怎么办?find -perm /754
请举例说明。
答案1
它基本上是所有三位(-mode
)和任何单个位(/mode
)权限(-perm
)子集测试之间的差异。
find -perm -mode
:在这种情况下,所提到的权限位必须存在于文件中。例如,如果您这样做
find -perm -666
并且文件具有776
,它将被匹配。类似地666
,777
等也将匹配,但665
不会被匹配。总之,所提到的(三个)位必须是权限位的子集。find -perm /mode
:这里,子集的任何一个位都可以。例如,如果我们执行
find -perm /666
,并且如果文件具有644
,则该文件将被匹配,因为用户权限位是6
,并且我们正在寻找单个位子集。类似地,700
、060
、006
等将被匹配,但例如 不会匹配444
,因为没有位包含所需权限位的任何子集。
答案2
另一个答案正确地解释了该find -perm -mode
部分。然而,这个答案纠正了关于该部分的一个错误说法find -perm /mode
。
这里任何一个子集都可以。例如,如果我们找到 -perm /666,并且如果文件有 644,则该文件将被匹配,因为用户权限位是 6,而我们正在寻找单个位子集。同样,700、060、006 等将被匹配,但 444 则不匹配,因为没有位包含所需权限位的任何子集。
444
第一句话是正确的,但是声称不匹配的部分不正确。
-perm /mode
如果任何权限位匹配则匹配,而不是整数。
当传递 /666 时,我们要求find
命令查找具有以下任何位的文件rw-rw-rw
(6 = 4+2,表示 rw-)。因此,它将匹配任何类型的所有者(用户、组或其他)可读、可写或两者兼有的任何文件。这意味着唯一不会匹配的文件是具有以下权限的文件:000
、001
、010
、011
、100
、101
、110
和111
。任何其他权限都将匹配,-perm /666
因为它将具有分配给它的读取或写入标志。
为了进一步说明,请查看以下示例。
for h in {0..7}; \
do for i in {0..7}; \
do for j in {0..7}; \
do for k in {0..7}; \
do \
touch $h$i$j$k; \
chmod $h$i$j$k $h$i$j$k; \
done; \
done; \
done; \
done
find -perm /666 -printf '%04m %M\n' | grep 444
7444 -r-Sr-Sr-T
6444 -r-Sr-Sr--
5444 -r-Sr--r-T
4447 -r-Sr--rwx
4446 -r-Sr--rw-
4445 -r-Sr--r-x
4444 -r-Sr--r--
4443 -r-Sr---wx
4442 -r-Sr---w-
4441 -r-Sr----x
4440 -r-Sr-----
3444 -r--r-Sr-T
2444 -r--r-Sr--
1444 -r--r--r-T
0444 -r--r--r--
因此,它唯一不匹配的是权限不包含 2 或 4 的文件:即所有仅包含 1 或 0 的文件:
# remove special permissions (since it was 0 every file that matches and only differs in the set of special permissions is found again)
find \! -perm /666 -printf '%04m %M\n' | grep '^0'| sed 's/ .../ /g'
0111 x--x--x
0110 x--x---
0101 x-----x
0100 x------
0011 ---x--x
0010 ---x---
0001 ------x
0000 -------
也许可以澄清一下:
授予以下权限
- WXYZ:文件权限(例如 0755 W=0,Z=5)
- wxyz:搜索权限
- 如果至少有一位匹配,则 w&W > 0
/
是一个或运算:
return w&W || x&X|| y&Y || z&Z
即,如果文件包含任何与搜索到的权限(wz)匹配(至少)的权限(WZ),则返回。
while
-
是 AND 运算:
return w&W && x&X && y&Y && z&Z
即,如果文件包含所有权限(WZ)且至少匹配搜索到的权限(wz),则返回。
在这两种情况下,这可能意味着 W 设置了超过 w 位(6 设置了 2 和 4,但没有设置 3 或 1)