统计所有用户均未设置执行位的子目录数量的更优实现方案
解决方案
你原有实现的! -x $d仅校验当前用户的执行权限,无法满足所有用户的校验需求,推荐用find命令实现更简洁的写法,适配你的需求:
1. 统计当前目录下一级子目录(和你原有*/遍历范围一致)
find . -mindepth 1 -maxdepth 1 -type d ! -perm /u+x,g+x,o+x | wc -l
参数说明:
-mindepth 1:排除当前目录本身-maxdepth 1:仅遍历当前目录下的一级子项,不递归下一层-type d:仅匹配目录类型! -perm /u+x,g+x,o+x:-perm /mode表示任意权限位匹配mode就返回真,取反后即代表所有者、用户组、其他用户三类身份都没有执行权限,完全匹配你「所有用户执行位未设置」的需求wc -l:统计匹配结果的行数,即符合条件的目录总数
如果目录名可能包含换行符,可以用更严谨的写法避免统计错误:
find . -mindepth 1 -maxdepth 1 -type d ! -perm /u+x,g+x,o+x -printf '.' | wc -c
2. 递归统计所有层级子目录
去掉-maxdepth 1参数即可:
find . -mindepth 1 -type d ! -perm /u+x,g+x,o+x | wc -l
如果你偏好shell循环写法,适配所有用户校验的调整版如下:
count=0; for d in */; do [[ -d "$d" && ! $(stat -c "%a" "$d") =~ [1357] ]] && (( ++count )); done; echo "$count"
通过stat命令直接读取目录的8进制权限位,判断权限中不存在带执行位的数值(1、3、5、7),即可确认所有用户都没有执行权限。
内容的提问来源于stack exchange,提问作者Simd
相关产品推荐
相关产品推荐

