gpt4 book ai didi

python - 如何仅复制已存在的目标文件上已更改的文件内容?

转载 作者:太空宇宙 更新时间:2023-11-03 13:57:03 25 4
gpt4 key购买 nike

我有一个脚本,用于从一个位置复制到另一个位置,目录结构下的文件都是 .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") 是强制保留的,因为它通过月份名称确定当前目录.

编辑:

如果我们可以使用 filecmpshutil.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 是执行此类工作的更好方法,您需要执行增量文件列表或说数据增量所以,我宁愿使用 rsync 和 subprocess 模块。

但是,您也可以分配一个变量 Curr_date_month 来获取当前日期、月份和年份,作为您的要求,只需从当前月份和日期文件夹中复制文件。您也可以定义源变量和目标变量,以便于将它们写入代码。

其次,虽然您使用 getsize 检查文件大小,但我想添加一个 rsync 选项参数 --min-size= 以确保不要复制零字节文件。

你的最终代码在这里。

#!/bin/python3
import os
import glob
import datetime
import subprocess

def Copy_Logs():
# Variable Declaration to get the month and Curr_date_month
Info_month = datetime.datetime.now().strftime("%B")
Curr_date_month = datetime.datetime.now().strftime("%b_%d_%y")
Sourcedir = "/data1/logs"
Destdir = "/data2/logs/"
###### End of your variable section #######################
# The result of the below glob _is_ a full path
for filename in glob.glob("{2}/{0}/{1}/*.txt".format(Info_month, Curr_date_month, Sourcedir)):
if os.path.getsize(filename) > 0:
if not os.path.exists(Destdir + os.path.basename(filename)):
subprocess.call(['rsync', '-avz', '--min-size=1', filename, Destdir ])

if __name__ == '__main__':
Copy_Logs()

关于python - 如何仅复制已存在的目标文件上已更改的文件内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54197194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com