使用mkdir -p -m创建多级目录时权限未批量生效的问题咨询
问题原因与解决方案
为什么默认操作只对最后一个目录生效
这是POSIX标准对mkdir命令的规定:当使用-p选项创建多级目录时,-m指定的权限仅会应用到最后一级被创建的目录,中间的父目录会采用系统默认的目录权限(受当前umask值影响)。你遇到的750权限,就是777 - 227(umask)计算出来的默认值。
实现所有目录都为550权限的方法
方法1:逐个创建目录并指定权限
手动拆分多级路径,依次创建每个目录并指定-m 550,确保每一级都应用目标权限:
mkdir -m 550 /tmp/test1 mkdir -m 550 /tmp/test1/test2
如果路径层级更多,可以用循环简化操作:
target_dir="/tmp/test1/test2/test3" current_path="" # 拆分路径为各个层级 IFS='/' read -ra dir_parts <<< "$target_dir" for part in "${dir_parts[@]}"; do [ -z "$part" ] && continue current_path="$current_path/$part" mkdir -m 550 "$current_path" done
方法2:先创建多级目录,再递归修改权限
如果确认目标路径下没有已存在的文件/目录(避免误改权限),可以先创建所有目录,再用chmod -R递归修改权限:
mkdir -p /tmp/test1/test2 chmod -R 550 /tmp/test1
注意:这个方法会修改目标路径下所有子目录和文件的权限,如果该路径之前有内容,谨慎使用。
方法3:使用GNU coreutils的install命令替代
GNU的install命令支持创建多级目录并统一设置权限:
install -d -m 550 /tmp/test1/test2
这个命令会自动创建所有需要的父目录,并且所有新创建的目录都会应用-m指定的550权限,是最简洁的方案(仅适用于GNU环境,比如Linux系统)。
内容的提问来源于stack exchange,提问作者Jörg Kauke
相关产品推荐
相关产品推荐

