AIX系统中find命令权限检查的结果差异原因及最优方法咨询
AIX系统中find命令权限检查的结果差异原因及最优方法咨询
嘿,我来帮你把这个问题拆明白,先解决你最困惑的「类型顺序不同结果不同」的问题,再聊聊哪种方法更靠谱。
为什么-type d,f和-type f,d结果不一样?
核心原因是:AIX的find命令不支持用逗号分隔多个-type类型值。
你可能习惯了Linux上GNU find支持-type d,f这种写法,但AIX的find遵循传统BSD风格,它会把d,f当成一个完整的类型参数解析——实际上它只会读取第一个字符作为匹配类型:
- 写
-type d,f时,它只识别d,也就是只查找目录,所以结果里只有/test/directory; - 写
-type f,d时,它只识别f,也就是只查找普通文件,所以结果里只有/test/test1。
这就是调换顺序结果不同的本质——你的写法不符合AIX find的语法,导致条件被错误解析了。如果要在AIX里同时匹配目录和普通文件,正确写法是用-o(逻辑或)连接两个-type条件:
find /test \( -type d -o -type f \) \( -perm -o=w -a \( -perm -u=x -o -perm -g=x -o -perm -o=x \) \) -ls
哪种方法是最优解?
你最后用的「排除特殊文件」的方法,是更严谨、更符合需求的最优选择:
find /test ! \( -type s -o -type p -o -type b -o -type c -o -type l \) \( -perm -o=w -a \( -perm -u=x -o -perm -g=x -o -perm -o=x \) \) -ls
为什么说它更好?
- 完全贴合需求:明确排除了socket(s)、命名管道(p)、块设备(b)、字符设备(c)、符号链接(l)这些不需要检查的文件类型,剩下的正好是需要检查的目录和普通文件;
- 兼容性强:这种写法在AIX和其他类Unix系统上都通用,不会因为不同
find实现的语法差异出问题; - 逻辑更严谨:通过「排除不需要的」定位「需要的」,比罗列需要的类型更不容易遗漏(比如以后新增特殊类型,只要补充到排除列表即可)。
额外小优化
你可以把权限检查的条件简化一下,提升可读性:
find /test ! \( -type s -o -type p -o -type b -o -type c -o -type l \) -perm -o=w -a -perm -111 -ls
这里的-perm -111等价于「所有者/组/其他任意一方有执行权限」,和你原来的权限检查逻辑完全一致,但写法更简洁。
备注:内容来源于stack exchange,提问作者medisamm
相关产品推荐
相关产品推荐

