如何在bash中遍历所有文件夹及子文件夹,修改root属主的文件目录权限
解决方案
最推荐直接使用find命令实现需求,无需自行编写遍历逻辑,原生支持递归遍历、属主/属组过滤,兼容含空格、特殊字符的文件名,执行效率更高:
# 请将/path/to/parent替换为你需要遍历的父目录实际路径 # 该命令会匹配所有属主为root或属组为root的文件/目录,同时修改属主和属组 sudo find /path/to/parent \( -user root -o -group root \) -exec chown anotheruser:anotheruser {} +
参数说明:
find默认递归遍历目标路径下所有层级的子目录和文件\( -user root -o -group root \)是过滤规则,仅匹配属主为root 或者 属组为root的对象-exec chown ... {} +批量对匹配到的对象执行权限修改,比逐行处理效率高很多
如果你需要仅修改对应为root的部分,保留非root的属主/属组配置,可以拆成两条命令执行:
# 仅修改属主为root的对象的属主 sudo find /path/to/parent -user root -exec chown anotheruser {} + # 仅修改属组为root的对象的属组 sudo find /path/to/parent -group root -exec chgrp anotheruser {} +
如果你坚持要调整你原有代码的逻辑实现递归遍历,需要做两处核心修改:
- 放弃用
ls输出遍历文件的方式,避免文件名带空格、特殊字符时执行异常 - 将权限修改逻辑封装为递归函数,遇到目录时调用函数进入子目录遍历
修改后的脚本示例:
#!/bin/bash target_user="anotheruser" # 递归遍历处理函数 traverse_modify() { for item in "$1"/*; do # 跳过空目录下无法展开的*通配符 [ -e "$item" ] || continue # 用stat读取属主属组,比解析ls输出更稳定 cur_owner=$(stat -c "%U" "$item") cur_group=$(stat -c "%G" "$item") if [ "$cur_owner" = "root" ]; then sudo chown "$target_user" "$item" else echo "$item 属主非root,跳过改属主" fi if [ "$cur_group" = "root" ]; then sudo chgrp "$target_user" "$item" else echo "$item 属组非root,跳过改属组" fi # 是目录则递归进入遍历 if [ -d "$item" ]; then traverse_modify "$item" fi done } # 替换为你要遍历的父目录路径,启动遍历 traverse_modify "/path/to/parent"
内容的提问来源于stack exchange,提问作者user13754206
相关产品推荐
相关产品推荐

