我正在编写一个脚本,用于将编译后的文件从一个位置复制到另一个位置。
我现在所拥有的是这样的:
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
我的问题是,许多被复制的文件都是大文件,并不是所有文件都在每个编译周期中重新编译。理想情况下,我只想复制此脚本中已更改的文件。有什么方法可以做到这一点吗?
答案 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实现
答案 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)