Bash脚本权限设置问题:仅修改文件夹内文件而非文件夹本身
我来帮你调整这个Bash脚本,解决你遇到的问题——让它只修改目标文件夹内的文件(完全不触碰文件夹本身的权限和属主)。先梳理下原脚本的小问题:它在处理文件夹时,虽然没直接修改顶层文件夹,但存在路径空格兼容问题、空文件夹处理不当的情况,而且如果不需要修改子文件夹的话,也没做针对性过滤。
下面是修改后的脚本,我会在后面逐一解释关键改动:
#!/bin/bash path="$1" octal="$2" user="${3:-$(/usr/bin/id -run)}" group="$4" GREEN='\033[0;32m' RED='\033[0;31m' # 校验权限参数,禁止777及以上风险权限 if [[ "$octal" -gt 766 ]]; then tput setaf 1 echo -e "${RED}777 is not allowed!!! :-(" tput sgr0 exit 1 fi if [[ -f "$path" ]]; then # 处理单个文件的逻辑,优化了引号包裹避免路径问题 chmod "$octal" "$path" chown "$user:$group" "$path" tput setaf 2 echo "Permission set to $octal" echo "User set to $user" echo "Group set to $group" ls -l "$path" elif [[ -d "$path" ]]; then # 处理文件夹:只修改内部文件,不碰顶层文件夹 for f in "$path"/*; do # 空文件夹时,$path/*会变成字面字符串,直接跳过这种无效情况 [[ -e "$f" ]] || continue # 只处理文件,如果你需要连子文件夹一起改,删掉下面这个if判断即可 if [[ -f "$f" ]]; then chmod "$octal" "$f" chown "$user:$group" "$f" tput setaf 2 echo "Updated file: $f" echo " Permission: $octal" echo " Owner: $user:$group" fi done # 显示顶层文件夹的信息,但明确标注未修改 echo -e "\nTop-level folder (unchanged):" ls -ld "$path" else # 处理无效路径的情况,给出明确提示 tput setaf 1 echo -e "${RED}Error: '$path' is not a valid file or directory!" tput sgr0 exit 1 fi exit 0
关键改动说明:
- 全路径加引号:所有涉及路径的变量都用双引号包裹,彻底解决路径含空格、特殊字符时的命令崩溃问题
- 默认值写法优化:用
${3:-...}代替原脚本的${3:=...},不会修改原始位置参数,逻辑更安全稳定 - 空文件夹处理:增加
[[ -e "$f" ]] || continue判断,避免空文件夹时对$path/*这个无效字符串执行命令 - 文件过滤逻辑:新增
-f "$f"判断,确保只修改文件夹内的文件;如果需要修改文件夹内的所有内容(包括子文件夹),直接删掉这个if判断就行 - 错误提示补充:新增了无效路径的判断,给用户清晰的错误反馈,避免无意义的脚本执行
- 输出更友好:调整了输出内容格式,让每个文件的修改信息更清晰,同时明确标注顶层文件夹未被修改
这样调整后,脚本就只会修改目标文件夹内的文件,完全不会改动文件夹本身的权限和属主啦。
内容的提问来源于stack exchange,提问作者user2702643
相关产品推荐
相关产品推荐

