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

