如何递归执行chmod仅为目录添加ug+X权限
如何递归执行chmod仅为目录添加ug+X权限
我太懂你这种踩坑的感觉了——本来以为chmod +X只会给目录加执行权限,结果发现那些本来就有执行位的文件也被偷偷加上了全局执行权限,完全偏离预期。别慌,用find命令就能精准实现你要的效果:只递归修改目录的权限,丝毫不碰普通文件。
直接可用的命令
find /你要操作的路径 -type d -exec chmod ug+X {} +
命令拆解说明
-type d:这是关键,让find只筛选出所有目录,完全忽略普通文件、链接等其他类型的文件-exec chmod ug+X {} +:对找到的每一批目录执行chmod ug+X操作,{}代表找到的目录路径,+表示把多个目录一次性传给chmod,比逐个处理效率更高
验证一下效果
用你给出的测试场景来验证:
# 创建测试目录和文件 mkdir directory touch file # 设置初始权限 chmod 654 directory file # 查看初始状态 ls -ld directory file # 执行我们的命令 find . -type d -exec chmod ug+X {} + # 再次查看结果 ls -ld directory file
执行后你会得到想要的结果:
drwxr-xr--. 2 user group 4096 Nov 26 09:50 directory -rw-r-xr--. 1 user group 0 Nov 26 09:50 file
补充:另一种写法(用xargs)
如果你习惯用xargs,也可以这么写:
find /你要操作的路径 -type d | xargs chmod ug+X
不过要注意,如果目录名里包含空格,这种写法可能出问题,还是前面的-exec ... +更稳妥。
为什么之前的方法不行?
再回顾下chmod的X选项规则:
execute/search only if the file is a directory or already has execute permission for some user (X)
也就是说,只要文件本身已经有任意用户的执行位,+X就会给所有用户加上执行位。而我们用find只锁定目录,就彻底避开了这个问题,完美实现只给目录加权限的需求。
备注:内容来源于stack exchange,提问作者carl verbiest
相关产品推荐
相关产品推荐

