【发布时间】:2019-06-09 08:48:17
【问题描述】:
我有一个脚本,用于从一个位置复制到另一个位置,目录结构下的文件都是.txt 文件。
此脚本仅评估源上的文件大小,并且仅在文件大小不为零字节时复制。但是,我需要在一定的时间间隔后在 cron 中运行此脚本以复制任何增加的数据。
所以,我需要知道如何只复制在源文件上更新的文件内容,然后只为新内容更新目标,而不是在目标已经存在时覆盖。
代码:
#!/bin/python3
import os
import glob
import shutil
import datetime
def Copy_Logs():
Info_month = datetime.datetime.now().strftime("%B")
# The result of the below glob _is_ a full path
for filename in glob.glob("/data1/logs/{0}/*/*.txt".format(Info_month)):
if os.path.getsize(filename) > 0:
if not os.path.exists("/data2/logs/" + os.path.basename(filename)):
shutil.copy(filename, "/data2/logs/")
if __name__ == '__main__':
Copy_Logs()
我正在寻找是否有办法以rsync 工作的方式使用shutil(),或者是否有替代我拥有的代码的方法。
简而言之,如果尚未复制文件,我只需复制文件,然后仅在源更新时复制增量。
注意:Info_month = datetime.datetime.now().strftime("%B") 是必须保留的,因为它根据月份名称确定当前目录。
编辑:
如果我们可以使用 filecmp 和 shutil.copyfile 模块来比较文件和目录,只是有另一个原始想法,但我不知道如何将其放入代码中。
import os
import glob
import filecmp
import shutil
import datetime
def Copy_Logs():
Info_month = datetime.datetime.now().strftime("%B")
for filename in glob.glob("/data1/logs/{0}/*/*.txt".format(Info_month)):
if os.path.getsize(filename) > 0:
if not os.path.exists("/data2/logs/" + os.path.basename(filename)) or not filecmp.cmp("/data2/logs/" + os.path.basename(filename), "/data2/logs/"):
shutil.copyfile(filename, "/data2/logs/")
if __name__ == '__main__':
Copy_Logs()
【问题讨论】:
-
运行
rsync到subprocess 怎么样? -
@MikhailGerasimov,这可能是一种方法。
标签: python python-3.x subprocess rsync shutil