仅当源比Python中的目标更新时,如何复制文件?

时间:2010-02-15 13:34:14

标签: python

我正在编写一个脚本,用于将编译后的文件从一个位置复制到另一个位置。

我现在所拥有的是这样的:

import os
import shutil

shutil.copy2 (src, dst)
#... many more shutil.copy commands
#src is a filename string
#dst is the directory where the file is to be copied

我的问题是,许多被复制的文件都是大文件,并不是所有文件都在每个编译周期中重新编译。理想情况下,我只想复制此脚本中已更改的文件。有什么方法可以做到这一点吗?

7 个答案:

答案 0 :(得分:12)

你可以利用文件修改时间,如果这对你来说足够了:

# If more than 1 second difference
if os.stat(src).st_mtime - os.stat(dest).st_mtime > 1:
    shutil.copy2 (src, dst)

或者调用像rsync这样的同步工具。

答案 1 :(得分:8)

您可以使用distutils.file_util.copy_file设置可选参数update=1来执行智能复制。

还有一个版本使用distutils.dir_util.copy_tree复制整个目录。

然后,您可以验证其中任何一个是否真正有效并且仅复制所需文件by enabling logging

import distutils.log
import distutils.dir_util

distutils.log.set_verbosity(distutils.log.DEBUG)
distutils.dir_util.copy_tree(
    src_dir,
    dst_dir,
    update=1,
    verbose=1,
)

打印复制的文件。

答案 2 :(得分:4)

你可以试试这个python的rsync实现

http://freshmeat.net/projects/pysync/

答案 3 :(得分:4)

如果您没有明确的理由需要在python中自己编写代码,我建议使用rsync。从它的手册页:

  

Rsync速度非常快   多功能文件复制工具。它是   以其三角洲转移而闻名   算法,减少了数量   通过发送通过网络发送的数据   只有两者之间的差异   源文件和现有文件   目的地。

但是,如果你确实希望用Python编写代码,那么开始的地方就是学习 filecmp.cmp

答案 4 :(得分:1)

您希望如何查找已更改的文件?你可以在src上使用os.path.getmtime(path)并检查它是否比某个存储的时间戳(你上次复制的时间)更新或者使用filecmp.cmp(f1,f2 [,shallow])来检查文件是否更新。

注意使用filecmp.cmp,你也可以复制stat(copy2),所以你必须检查浅层比较对你来说是否足够好。

答案 5 :(得分:1)

来自AndiDog的回答:

os.stat(dst).st_mtime - os.stat(src).st_mtime
如果'src'文件较新,则

为负值,因此它应为:

if os.stat(src).st_mtime - os.stat(dst).st_mtime > 1:

答案 6 :(得分:1)

如果你有目标文件夹中可能不存在的文件,建立AndiDog的答案:

# copy file if destination is older by more than a second, or does not exist
if (not os.path.exists(dest)) or (os.stat(src).st_mtime - os.stat(dest).st_mtime > 1) :
    shutil.copy2 (src, dest)