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

bash命令chmod -R u+x $dir_path对应的Python实现方式是什么

问题解答

你提供的代码无法实现需求,原因如下:

  • os.fchmod和普通os.chmod一样,仅能作用于单个文件/目录对象,本身没有递归处理能力,完全达不到chmod -R的递归修改效果
  • 你的代码仅打开了目标根目录本身,没有任何遍历子目录、子文件的逻辑,最多只会修改根目录这一个对象的权限
  • 直接赋值stat.S_IXUSR会覆盖原有所有权限位,而原命令u+x是在原有权限基础上追加用户执行权限,不会删除已有的读、写等其他权限
  • 直接用Path(dir_path).open()打开目录的操作在部分系统下会直接报错,本身写法就不规范

正确实现方式

方案1:基于os.walk实现(兼容性最好,适配所有Python3版本)

import os
import stat

def chmod_recursive_u_x(dir_path):
    for root, dirs, files in os.walk(dir_path):
        # 修改当前目录权限
        root_mode = os.stat(root).st_mode
        os.chmod(root, root_mode | stat.S_IXUSR)
        # 修改当前目录下所有文件权限
        for file_name in files:
            file_path = os.path.join(root, file_name)
            file_mode = os.stat(file_path).st_mode
            os.chmod(file_path, file_mode | stat.S_IXUSR)

方案2:基于pathlib实现(写法更简洁,Python3.4+支持)

from pathlib import Path
import stat

def chmod_recursive_u_x(dir_path):
    root = Path(dir_path)
    # 先修改根目录权限
    root.chmod(root.stat().st_mode | stat.S_IXUSR)
    # 递归遍历所有子目录、子文件
    for sub_item in root.rglob("*"):
        item_mode = sub_item.stat().st_mode
        sub_item.chmod(item_mode | stat.S_IXUSR)

可选调整

如果你的实际场景只需要给目录加执行权限(进入目录需要执行权限,普通文件不需要执行权限的场景更常见),可以在修改权限前加判断if os.path.isdir(路径)或者if sub_item.is_dir(),按需调整即可。

内容的提问来源于stack exchange,提问作者adhnguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:45:07