免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 听钟客
打印 上一主题 下一主题

find的-perm 这个怎么理解? [复制链接]

论坛徽章:
0
1 [报告]
发表于 2008-08-26 15:13 |显示全部楼层
原帖由 寂寞烈火 于 2004-11-11 10:22 发表
-perm mode:搜索文件许可位正好是mode的文件
-perm +mode:搜索文件许可位部分符合mode的文件
-perm -mode:搜索文件许可位完全符合mode的文件



-perm +mode的理解有问题,大家请指教一下

sszheng@gz-10:~/shell/test/dir$ ls -l
total 0
-rwxrwxrwx 1 fai users 0 Aug 26 14:58 a
-rw-rw-rw- 1 fai users 0 Aug 26 14:58 b
---------- 1 fai users 0 Aug 26 14:58 c
-rw-r--r-- 1 fai users 0 Aug 26 14:58 d
-rw-r--r-- 1 fai users 0 Aug 26 14:58 e
-rw-r--r-- 1 fai users 0 Aug 26 14:58 f

$ find . -perm -777
./a
$ find . -perm -7
./a
$ find . -perm -6
./b
./a
$ find . -perm +6
.
./b
./d
./a
./f
./e
sszheng@gz-10:~/shell/test/dir$ find . -perm +006
.
./b
./d
./a
./f
./e
$ find . -perm +005
.
./b
./d
./a
./f
./e

上面说法自己解释不通
如何理解部分符合和完全符合?

论坛徽章:
0
2 [报告]
发表于 2008-08-26 16:17 |显示全部楼层
$ find . -perm +005

为何有这么多就出来?这个匹配如何理解?

论坛徽章:
0
3 [报告]
发表于 2008-08-26 23:57 |显示全部楼层

回复 #14 blackold 的帖子

明早回公司测试一下
黑哥先晚安了

论坛徽章:
0
4 [报告]
发表于 2008-08-28 16:24 |显示全部楼层

回复 #13 blackold 的帖子

黑哥的分析给了很多启发

我个人理解

像黑哥说那样,006和6是一样的,用0补齐吧。
首先将八进制转化为二进制,
也就是666:110 110 110的形式(只列三位),因为perm是根据二进制匹配判断的。

首先测试文件:

  1. $ ls -l
  2. total 0
  3. -rwxrwxrwx 1   fai     root       0 Aug 28 15:15 a
  4. -rwxr-xr-x    1   fai     root       0 Aug 28 15:15 b
  5. ----rw----     1   fai     root       0 Aug 28 15:15 c
  6. -rw-rw-rw-  1   fai     root       0 Aug 28 15:15 d
  7. -r-xr--r--      1   fai     root       0 Aug 28 15:15 e
复制代码


引用烈火兄所说的
-perm +mode:搜索文件许可位部分符合mode的文件
-perm -mode:搜索文件许可位完全符合mode的文件

对于-perm mode,转换为二进制,然后进行对比,看以下例子:

  1. $ find . -perm +006
  2. .
  3. ./b
  4. ./d
  5. ./a
  6. ./e
复制代码

对于权限进行8进制转2进制
a(777):111 111 111
b(755):111 101 101
c(060): 000 110 000
d(666):110 110 110
e(544):101 100 100

而mode中的006转为2进制是:000 000110
根据部分匹配的原则,只要在第3组中的第一或者第二位出现1就可以了,所以看到e文件101只是匹配了第一位的1,但是也打印了。而a文件111的情况更是符合这个说法了。注意:c文件虽然出现了110,但是不是对应的组,这个匹配是在相应位的。

对于-perm -006,也同样道理去判断,只是这里需要完全匹配,也就是mode的二进制中出现1的地方,目标中也要出现才行。

  1. $ find . -perm -006
  2. ./d
  3. ./a
复制代码

需要在最后一组中的第一和第二位同时出现1才能匹配。
a(777):111 111 111
d(666):110 110 110

不知道我这么啰嗦,说明白没有?
但是对于这个查找结果的排序,我还是不明白,为什么d在a之前显示?

论坛徽章:
0
5 [报告]
发表于 2008-08-28 16:47 |显示全部楼层

回复 #17 blackold 的帖子

对,find的输出顺序

论坛徽章:
0
6 [报告]
发表于 2008-08-28 17:09 |显示全部楼层

回复 #19 blackold 的帖子

$ find .
.
./b
./d
./a
./c
./e

怎么理解这个输出?

论坛徽章:
0
7 [报告]
发表于 2008-08-28 17:16 |显示全部楼层

回复 #21 blackold 的帖子

这个几个文件都是空的

touch a b c d e建立的,没有什么其他附加因素影响

论坛徽章:
0
8 [报告]
发表于 2008-08-28 17:58 |显示全部楼层

回复 #23 blackold 的帖子

好,记入待解决问题行列

分别在rh,debian和FreeBSD环境测试

都是GNU bash

只有FreeBSD的结果是顺序的,难道是bug?再找找

论坛徽章:
0
9 [报告]
发表于 2008-08-28 18:26 |显示全部楼层
I have files located in directories that are sorted by date (YYYY-MM-DD) and when I do a find . -type d they are outputted randomly.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP