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")是强制性的保持,因为这决定按月名当前目录。
编辑:
只要有其他原材料的想法,如果我们可以用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()
Run Code Online (Sandbox Code Playgroud)
如上所述,这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)
| 归档时间: |
|
| 查看次数: |
1520 次 |
| 最近记录: |