2010-02-15 86 views
5

我是一个python新手,我正在编写一个脚本来将编译好的文件从一个位置复制到另一个位置。我目前所面对的是非常简单的,像这样:我们可以在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 

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

回答

9

你可以使用的文件的修改时间,如果这足以让你:

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

或致电同步像rsync这样的工具。

+3

为什么'> 1' - 应该说不是'> 0'? – Wikis 2014-09-24 08:33:04

+0

取决于用例,我想。如果文件总是使用'shutil.copy2'写入,那么修改时间可以预期完全相等(然后是'> 0')。 – AndiDog 2014-09-24 10:49:42

4

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

Rsync是一个快速和异常 多功能文件复制工具。它是 以其delta-transfer 算法而闻名,它通过发送 源文件和 目标文件中的现有文件之间的差异来减少通过网络发送的数据量。

如果你想用Python编写这一点,但是,随后开始的地方将是研究 filecmp.cmp

1

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

小心filecmp.cmp,你也复制stat(copy2),所以你必须检查一个浅的比较是否足够适合你。

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: 
0

要建立在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)