Как сравнить размеры файлов для двух разных дат в Linux с помощью Python3

Я новичок в python и каждый день делаю резервную копию данных своего сервера. Я использую сценарий оболочки для проверки дат резервного копирования, но когда веб-хостинг все больше и больше использует сценарий оболочки, необходимо многое изменить. Итак, я хочу использовать python для проверки моего файла резервной копии.

Моя среда:

ОС: убунту 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, но все равно не работает нормально. Я что-то не заметил? или что-то, на что я могу ссылаться? Спасибо за помощь!


person Kai Kudou    schedule 09.11.2017    source источник


Ответы (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 файлами, и он работает нормально. Дайте мне знать, если это не сработает.

person Alperen    schedule 09.11.2017
comment
Спасибо за помощь! Я ссылаюсь на ваш код, и это действительно меня очень вдохновило. Я не думал, что смогу использовать два цикла for, чтобы сделать это. Спасибо еще раз. - person Kai Kudou; 10.11.2017