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
相关产品推荐
相关产品推荐

