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

如何在Python中复制非空文件夹?(模拟Unix的cp -r命令)

实现类似Unix cp -r 的文件/目录复制功能

问题分析

你当前的代码会报错,因为shutil.copytree()仅用于复制目录,而你的源路径指向单个文件(/tmp/Folder1/file.txt),不符合该函数的使用场景。

解决方案

要实现类似cp -r的功能(同时支持文件和目录复制,且保留源路径的层级结构到目标目录),可以封装一个自定义函数,结合shutil.copy2()(复制文件)和shutil.copytree()(复制目录),并自动处理路径层级的创建:

import os
import shutil

def cp_r(source, dest):
    # 判断源是文件还是目录,构建目标路径
    if os.path.isfile(source):
        # 提取源文件所在的父目录名,拼接目标路径
        src_parent_dir = os.path.basename(os.path.dirname(source))
        target_file_path = os.path.join(dest, src_parent_dir, os.path.basename(source))
        # 创建目标父目录(不存在则创建)
        os.makedirs(os.path.dirname(target_file_path), exist_ok=True)
        # 复制文件,保留元数据(如修改时间)
        shutil.copy2(source, target_file_path)
    elif os.path.isdir(source):
        # 提取源目录名,拼接目标目录路径
        src_dir_name = os.path.basename(source)
        target_dir_path = os.path.join(dest, src_dir_name)
        # 复制整个目录,允许目标目录已存在(合并内容)
        shutil.copytree(source, target_dir_path, dirs_exist_ok=True)
    else:
        raise FileNotFoundError(f"源路径 {source} 不存在或无效")

# 调用示例:复制单个文件并保留层级
cp_r('/tmp/Folder1/file1.txt', '/tmp/Folder2/')

代码说明

  • 文件复制逻辑:自动提取源文件的父目录名,在目标路径下创建对应子目录,再复制文件,最终得到/tmp/Folder2/Folder1/file1.txt的结果。
  • 目录复制逻辑:直接将源目录完整复制到目标路径下,dirs_exist_ok=True参数支持目标目录已存在时的合并(和cp -r行为一致)。
  • 兼容性:适用于Python 3.8及以上版本(dirs_exist_ok参数在3.8版本后引入)。

内容的提问来源于stack exchange,提问作者Rahul Kumar Vishwakrma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:01:30