You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 {} +

如果你坚持要调整你原有代码的逻辑实现递归遍历,需要做两处核心修改:

  1. 放弃用ls输出遍历文件的方式,避免文件名带空格、特殊字符时执行异常
  2. 将权限修改逻辑封装为递归函数,遇到目录时调用函数进入子目录遍历

修改后的脚本示例:

#!/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:45:05