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

使用Python复制目录时如何保留源目录的时间戳?

这个问题我之前也碰到过——shutil.copytree() 默认只复制文件内容,并不会完整保留源目录和文件的元数据(包括时间戳)。不过有两个简单的办法可以解决:

方法1:用shutil.copy2作为复制函数

shutil.copy2() 是Python标准库中专门用来保留文件元数据(修改时间、访问时间、权限等)的复制方法。我们只需要把它传给copytree的copy_function参数,就能让复制过程自动保留文件的时间戳:

import os, shutil

sourceFolderPath = "/path/to/your/source"
destinationFolderPath = "/path/to/your/destination"

# 使用copy2作为复制函数,保留文件元数据
shutil.copytree(sourceFolderPath, destinationFolderPath, copy_function=shutil.copy2)

⚠️ 注意:这个方法会让所有文件的时间戳和源文件一致,但目录本身的时间戳还是会被设置为复制操作执行的时间。如果需要连目录的时间也完全同步,看下面的进阶方法。

方法2:同步目录的时间戳(完全一致)

如果想要整个目录结构(包括所有子目录)的时间戳都和源目录完全匹配,我们可以在复制完成后,遍历所有目录并同步时间戳:

import os, shutil, time

def copy_tree_with_full_timestamps(src, dst):
    # 第一步:复制文件并保留文件元数据
    shutil.copytree(src, dst, copy_function=shutil.copy2, dirs_exist_ok=True)
    
    # 第二步:遍历所有源目录,同步时间戳到目标目录
    for src_dir, _, _ in os.walk(src):
        # 计算对应的目标目录路径
        dst_dir = src_dir.replace(src, dst, 1)
        if os.path.isdir(dst_dir):
            # 获取源目录的访问时间(st_atime)和修改时间(st_mtime)
            src_stat = os.stat(src_dir)
            # 设置目标目录的时间戳
            os.utime(dst_dir, (src_stat.st_atime, src_stat.st_mtime))

# 调用函数
sourceFolderPath = "/path/to/your/source"
destinationFolderPath = "/path/to/your/destination"
copy_tree_with_full_timestamps(sourceFolderPath, destinationFolderPath)

这里用到了几个关键函数:

  • os.walk(src):递归遍历源目录的所有子目录
  • os.stat(src_dir):获取目录的元数据,包括时间戳
  • os.utime(dst_dir, ...):设置目标目录的访问时间和修改时间

另外,dirs_exist_ok=True是Python 3.8及以上版本支持的参数,如果你的Python版本较低,可以先判断目标目录是否存在,存在的话先删除或者跳过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:14:19