Unix/Bash中仅为新建目录修改组权限的实现方案求助
解决仅为新建目录修改组权限的问题
我来帮你搞定这个需求!你的思路是对的——要避免chgrp -R改动已存在的目录,就得先定位到路径中第一个不存在的节点,再针对性地创建和修改权限。先说说你草稿里的几个小问题:比如用了未定义的$my_string(应该是$LINE)、else -d的语法错误,还有逻辑没走完的问题,下面给你一个完整的可运行脚本,再拆解关键逻辑。
完整脚本实现
#!/bin/bash # 检查输入参数是否合法 if [ $# -ne 1 ]; then echo "用法: $0 <存储路径的文件>" exit 1 fi FILE="$1" TARGET_GROUP="group1" # 这里替换成你的目标组名 # 逐行读取文件中的路径 while IFS= read -r LINE; do # 跳过空行,避免无效处理 [ -z "$LINE" ] && continue # 处理绝对路径:解决路径以/开头导致数组第一个元素为空的问题 is_absolute=0 if [[ "$LINE" == /* ]]; then is_absolute=1 LINE="${LINE:1}" fi # 将路径拆分为单个目录的数组 IFS='/' read -ra DIR_PARTS <<< "$LINE" current_path="" created_new_dirs=0 # 逐层遍历目录节点,寻找第一个不存在的目录 for part in "${DIR_PARTS[@]}"; do # 拼接当前层级的完整路径 if [ $is_absolute -eq 1 ]; then current_path="/$part" is_absolute=0 # 仅第一次拼接时添加根目录的/ else current_path="$current_path/$part" fi # 如果当前路径不存在,就创建后续所有层级并修改权限 if [ ! -d "$current_path" ]; then # 创建从当前节点开始的所有目录 mkdir -p "$current_path" # 递归修改这个新路径下所有目录的组权限(都是刚新建的,不会影响旧目录) chgrp -R "$TARGET_GROUP" "$current_path" created_new_dirs=1 break # 已经处理完后续所有层级,跳出循环 fi done # 提示已存在的路径,方便排查 if [ $created_new_dirs -eq 0 ]; then echo "提示:路径 $current_path 已存在,未修改权限" fi done < "$FILE"
关键逻辑拆解
- 处理绝对路径:如果路径以
/开头,先标记并去掉开头的/,避免拆分后数组第一个元素为空,导致拼接路径出错。 - 逐层检查存在性:从最顶层目录开始,一步步拼接路径并检查是否存在,直到找到第一个不存在的节点。
- 精准修改权限:找到不存在的节点后,用
mkdir -p一次性创建后续所有层级,再对这个新创建的路径递归执行chgrp——这样只会修改刚新建的目录,完全不会触动之前已存在的父目录。 - 健壮性优化:跳过空行、检查输入参数、处理带空格的路径(用
IFS= read -r和双引号包裹变量)。
使用说明
- 把脚本里的
TARGET_GROUP="group1"替换成你实际需要的组名。 - 给脚本添加执行权限:
chmod +x create_dirs_with_group.sh。 - 运行脚本:
./create_dirs_with_group.sh 你的路径文件.txt。
内容的提问来源于stack exchange,提问作者Elias777
相关产品推荐
相关产品推荐

