Как сравнить размеры файлов для двух разных дат в Linux с помощью Python3
Я новичок в Python, и я буду делать резервные копии данных моего сервера каждый день. Я использую сценарий оболочки для проверки дат резервного копирования, но когда веб-хост все больше и больше использует сценарий оболочки, необходимо многое изменить. Итак, я хочу использовать python для проверки моего файла резервной копии.
Мой Env это:
ОС: Ubuntu 16.04
Версия Python: 3.4.3
Мои каталоги и структура файлов похожи на:
/mnt/disk2/JP/TFP-1/Web/2017/11/TFP_20171105_htdocs.tar.gz
/mnt/disk2/JP/TFP-1/Config/crontab_backup_20171105.txt
/mnt/disk2/JP/TFP-1/Config/mysql_config_backup_20170724.tar.gz
/mnt/disk2/JP/SPT_1/Web/2017/11/SPT_20171105_htdocs.tar.gz
/mnt/disk2/JP/SPT_1/Config/nginx_config_backup_20171030.tar.gz
/mnt/disk2/CN/LHD-1/Web/2017/11/LHD_20171105_htdocs.tar.gz
/mnt/disk2/CN/LHD-1/Config/crontab_backup_20171105.txt
/mnt/disk2/CN/LHD-1/Config/mysql_config_backup_20170724.tar.gz
/mnt/disk2/CN/TTY_1/Web/2017/11/TTY_20171105_htdocs.tar.gz
/mnt/disk2/CN/TTY_1/Config/nginx_config_backup_20171030.tar.gz
Из-за того, что в моем файле резервной копии есть дата и время, мой сценарий оболочки будет использовать сегодняшний размер файла до минус вчерашний размер файла. Если равно 0, это означает, что файл резервной копии не изменился, если не 0, он отправит уведомление по электронной почте, чтобы уведомить меня.
(Но если разница в размере файла невелика, это не имеет значения. Мне нужно только заметить разницу в размере файла более 1 ГБ. Поэтому я не использую md5 или filecmp для сравнения)
Теперь я хочу сделать ту же программу с использованием python, но я остановился на расчете размеров файлов для двух разных дат.
Это мой код:
## Import Module
import sys
import os
import re
from datetime import datetime, timedelta
# Global Variables
jpWebList = ["/mnt/disk2/JP/TFP-1/Web", "/mnt/disk2/JP/SPT_1/Web"]
jpConfigList = ["/mnt/disk2/JP/TFP-1/Conig", "/mnt/disk2/JP/SPT_1/Config"]
## Function Program
#-- Get file name's time and calculate yesterday.
def findYtdFile(filePath):
YtdData = ""
fsize = 0
now = datetime.now()
aDay = timedelta(days=-1)
yDay = now + aDay
yDay = yDay.strftime("%Y%m%d") # formatted the byDay value into 20170820.
# print(yDay) # Check yDay's value.
# print(filePath)
if re.search(yDay, filePath) is not None:
# print(filePath)
YtdData = filePath
# print(YtdData) # Check what kinds of file we got.
fsize = os.path.getsize(YtdData)
print(YtdData, "--file size is", fsize)
return fsize
#-- Get file name's time and calculate the day before yesterday
def findDbyFile(filePath):
DbyData = ""
fsize = 0
now = datetime.now()
aDay = timedelta(days=-2)
byDay = now + aDay
byDay = byDay.strftime("%Y%m%d") # formatted the byDay value into 20170820
# print(byDay) # Check byDay's value.
if re.search(byDay, filePath) is not None:
DbyData = filePath
fsize = os.path.getsize(DbyData)
print(DbyData, "--file size is", fsize)
return fsize
#--Main, Get tar.gz and txt file list.
for tmpList in jpWebList:
for root, dirs, files in os.walk(tmpList): # recursive to get directories and files list.
for file in files:
if file.endswith((".tar.gz", ".txt")):
filePath = os.path.join(root, file)
ytdFileSize = findYtdFile(filePath)
dbyFileSize = findDbyFile(filePath)
a = ytdFileSize - dbyFileSize
print(a)
и терминал показывает:
/mnt/disk2/JP/TFP-1/Web/2017/11/TFP_backend_20171106_htdocs.tar.gz --file size is 76021633
76021633
0
/mnt/disk2/JP/TFP-1/Web/2017/11/TFP_backend_20171105_htdocs.tar.gz --file size is 76012434
-76012434
/mnt/disk2/JP/TFP-1/Web/2017/11/TFP_Test_backend_20171106_htdocs.tar.gz --file size is 62391961
62391961
0
0
0
/mnt/disk2/JP/TFP-1/Web/2017/11/TFP_Test_front_20171105_htdocs.tar.gz --file size is 82379384
-82379384
/mnt/disk2/JP/TFP-1/Web/2017/11/TFP_Test_front_20171106_htdocs.tar.gz --file size is 82379384
82379384
0
0
0
0
0
/mnt/disk2/JP/TFP-1/Web/2017/11/TFP_Test_backend_20171105_htdocs.tar.gz --file size is 62389231
-62389231
Предполагается, что ответ "TFP_Test_front_20171106_htdocs.tar.gz(82379384)" "минус"TFP_Test_backend_20171105_htdocs.tar.gz(62389231)"равен 19990153.
Я пробовал glob, re.findall, os.listdir, но все еще не работает нормально. Есть что-то, чего я не заметил? или что-то, на что я могу сослаться? Спасибо за помощь!
1 ответ
Я не вижу, что не так в вашем коде, но я изменил ваш код и попытался упростить его:
import sys, os
from datetime import datetime, timedelta
jpWebList = ["/mnt/disk2/JP/TFP-1/Web", "/mnt/disk2/JP/SPT_1/Web"]
jpConfigList = ["/mnt/disk2/JP/TFP-1/Conig", "/mnt/disk2/JP/SPT_1/Config"]
def get_date(d):
aDay = timedelta(days=d)
byDay = datetime.now() + aDay
return byDay.strftime("%Y%m%d")
#main
today = get_date(0)
yesterday = get_date(-1)
for tmpList in jpWebList:
for root, dirs, files in os.walk(tmpList):
todays_files = [file for file in files if today in file and file.endswith((".tar.gz", ".txt"))]
yesterdays_files = [file for file in files if yesterday in file and file.endswith((".tar.gz", ".txt"))]
for todays_file in todays_files:
yesterdays_file = todays_file.replace(today, yesterday)
if yesterdays_file in yesterdays_files:
todays_path = os.path.join(root, todays_file)
yesterdays_path = os.path.join(root, yesterdays_file)
size_difference = os.path.getsize(todays_path) - os.path.getsize(yesterdays_path)
print(size_difference)
Я не могу проверить это полностью без папок и файлов, которые у вас есть, но я попробовал с 2 файлами, и он отлично работает. Дайте мне знать, если это не сработает.