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

kro*_*516 5 python rsync subprocess shutil python-3.x

我有一个脚本,用于从一个位置复制到另一个位置,目录结构下的文件都是.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()
Run Code Online (Sandbox Code Playgroud)

我正在寻找是否有办法shutil()rsync工作中使用,或者是否有替代我拥有的代码的方法。

简而言之,如果尚未复制文件,我只需要复制文件,然后仅在源更新时复制增量。

注: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()
Run Code Online (Sandbox Code Playgroud)

Kar*_*mar 3

如上所述,这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()
Run Code Online (Sandbox Code Playgroud)