Удаление старых резервных копий (Немножко Python-а)

Появилась тут маленькая задача по администрированию резервных копий 1С на отдельном FTP сервере. Каждую ночь на него загружаются резервные копии баз нескольких клиентов. Сами копии создаются программами Cobian Backup и Cobian Reflector. Раньше удалял старые копии руками, чтобы не забивался под завязку HDD, но после пятой такой зачистки надоело.

В свое время немного упражнялся в Python на уровне циклов и условий (спасибо курсу «Поколение Python»: курс для начинающих от stepik.org). Язык хорош для всего и много администраторов автоматизируют свою работу именно им. Что ж, дорогу осилит идущий, и, я взялся себе немного помочь.

Вооружился книгой и Google.Мне понадобилось:
1. Работа с файлами на уровне ОС
2. Работа с атрибутами файлов
3. Работа с датами
4. Работа с параметрами, передаваемыми в скрипт


  1. Как получить ВСЕ файлы в директории и поддиректориях
import os

os.chdir("d:\\tmp")
for root, dirs, files in os.walk(".", topdown = False):
for name in files:
print(os.path.join(root, name))
for name in dirs:
print(os.path.join(root, name))

2. Как получить дату изменения файлов

import os

os.chdir("d:\\tmp")
for root, dirs, files in os.walk(".", topdown = False):
for name in files:
print(os.path.join(root, name))
for name in dirs:
print(os.path.join(root, name))

3. Как получить дату и разницу в днях между датами

# Getting current date and time using now().
# importing datetime module for now()
import datetime
# using now() to get current time
current_time = datetime.datetime.now()
# Printing value of now.
print("Time now at greenwich meridian is:", current_time)
from datetime import date as date_n

def number_of_days(date_1, date_2):
return (date_2 - date_1).days

# Driver program
date_1 = date_n(2023, 9, 10)
date_2 = date_n(2025, 2, 4)
print ("Number of Days between the given Dates are: ", number_of_days(date_1, date_2), "days")

4. Как обработать передаваемые в скрипт параметры

import argparse

def createParser ():
parser = argparse.ArgumentParser()
parser.add_argument ('name', nargs='?')

return parser

parser = createParser()
namespace = parser.parse_args()

# print (namespace)

if namespace.name:
print ("Привет, {}!".format (namespace.name) )
else:
print ("Привет, мир!")

В итоге получился такой скрипт, который запускается планировщиком cron раз в месяц и удаляет файлы старше 28 дней, но младше 62. В качестве параметра передается начальная директория.

import os
import datetime
import argparse

def createparser():
parser1 = argparse.ArgumentParser()
parser1.add_argument('basedir', nargs='?')
return parser1

def number_of_days(date_1, date_2):
return (date_2 - date_1).days

parser = createparser()
namespace = parser.parse_args()
basedir = namespace.basedir

for root, dirs, files in os.walk(basedir+"."):
for name in files:
raz_date = number_of_days(datetime.datetime.fromtimestamp(os.stat(os.path.join(root, name)).st_ctime), datetime.datetime.now())
if (raz_date > 28) and (raz_date < 62):
os.remove(os.path.join(root,name))

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *