Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/56: Рейтинг темы: голосов - 56, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 09.11.2010
Сообщений: 14

Скрипт резервного копирования

08.12.2010, 22:46. Показов 12226. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят помогите пожалуйста, я в Python очень плохо разбираюсь, учили мы его очень быстро, практически сами.Задали такую работу.Написать скрипт создания системы резервного копирования УДАЛЕННЫХ ИЛИ ИЗМЕНЕННЫХ обьектов.Немного вот нашла по этой теме, но это не совсем то, здесь идет копирование всех файлов, а мне нужно только измененных или удаленных.Все кто может помочь, очень прошу помочь.У нас его толком никто не знает, вот и обратиться не к кому(((Как мне в этом скрипте зделать так чтоб копировалось то что мне нужно, а не все?
Вот скрипт с пояснениями:

Переместимся в корневой раздел:
[root@deep]# cd /

Важно всегда начинать с изготовления полной резервной копии, например, в пятницу:
Пятница 1 (используйте ленту 1 для первой полной резервной копии).
[root@deep /]# cd /
[root@deep /]# tar cpf /dev/st0 --label=" full-backup created on `date '+\
%d-%B-%Y'`." --directory / home
Понедельник (используется лента 2 для добавочной резервной копии).
[root@deep /]# cd /
[root@deep /]# tar cpNf /dev/st0 --label=" full-backup created on `date '+\
%d-%B-%Y'`." --directory / home
Вторник (используется лента 3 для добавочной резервной копии).
[root@deep /]# cd /
[root@deep /]# tar cpNf /dev/st0 --label=" full-backup created on `date '+\
%d-%B-%Y'`." --directory / home
Среда (используется лента 4 для добавочной резервной копии).
[root@deep /]# cd /
[root@deep /]# tar cpNf /dev/st0 --label=" full-backup created on `date '+\
%d-%B-%Y'`." --directory / home
Четверг (используется лента 5 для добавочной резервной копии).
[root@deep /]# cd /
[root@deep /]# tar cpNf /dev/st0 --label=" full-backup created on `date '+\
%d-%B-%Y'`." --directory / home
Пятница 2 (используется лента 6 для полной резервной копии).
[root@deep /]# cd /
[root@deep /]# tar cpf /dev/st0 --label=" full-backup created on `date '+\
%d-%B-%Y'`." --directory / home

Далее, делаем добавочные резервные копии на лентах со 2 по 5 и так далее.
Опция c определяет, что мы создаем архивный файл. Опция p сохраняет права доступа. Опция N делает добавочную резервную копию и запоминает файлы новее, чем DATE. Опция f говорит, что следующий аргумент будет либо именем архивного файла, либо именем устройства, на которое производится запись.
Объясним, как мы получили имя файла, который содержит текущую дату: просто поместим команду date между обратными кавычками. К основному имени добавляется суффикс tar для несжатых архивов, и суффикс tar.gz для сжатых. Так как мы не определяем конкретное имя для файла резервной копии, то воспользуемся опцией --label, которая позволяет записать некоторую информацию в архивный файл. В заключение мы определяем, что только файлы из каталога /home будут записаны на ленту.

Так как лента это устройство посимвольного ввода, мы не можем определить имя файла. Поэтому, в качестве аргумента для опции "имя файла" программы tar используется просто имя устройства /dev/st0. Устройство /dev/st0 не перематывается после создания резервной копии, поэтому мы имеем возможность записать на одну ленту несколько сессий. Мы можем также сказать устройству /dev/st0 автоматически перемотать ленту после окончания записи резервной копии.
Для уменьшения пространства, занимаемого tar-архивом, резервная копия может быть сжата при помощи опции z программы tar. К сожалению, использование этой опции может создать ряд проблем. Из природы работы сжатия следует, что если хотя бы один бит будет испорчен, то и все данные, нужные для восстановления будут потеряны. Поэтому рекомендуется не использовать сжатие (опция z) для создания резервной копии при помощи команды tar.
Если наша резервная копия не помещается на ленте, то нам надо использовать опцию --multi-volume (-M) для создания многотомных архивов:
[root@deep /]# cd /
[root@deep /]# tar cMpf /dev/st0 /home
Prepare volume #2 for /dev/st0 and hit return:
После того, как мы создали резервную копию, мы должны убедиться, что все хорошо, используем опцию --compare (-d):
[root@deep /]# cd /
[root@deep /]# tar dvf /dev/st0
Для резервного копирования всей системы используем следующую команду:
[root@deep /]# cd /

[root@deep /]# tar cpf /archive/full-backup-`date '+%d-%B-%Y'`.tar \
--directory / --exclude=proc --exclude=mnt \
--exclude=archive --exclude=cache --exclude=*/lost+found .

Опция --directory говорит tar, что до начала резервного копирования надо перейти в следующий каталог (в нашем примере /). Опция --exclude говорит tar не создавать резервные копии заданных каталогов и файлов. Символ ., находящийся в конце командной строки говорит tar, что он должен копировать все в текущем каталоге.

Когда мы создаем резервную копию нашей системы, ненужно включать в нее псевдофайловую систему /proc! Файлы в /proc не настояшие файлы, это просто файлоподобные ссылки к структуре ядра. Также не включаем каталоги /mnt, /archive и все lost+found.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.12.2010, 22:46
Ответы с готовыми решениями:

Скрипт для копирования текста из вышедшего поста в канале телеграм
Как написать скрипт на питоне,чтобы при выходе поста в определённом канале скопировалось его содержимое в буфер обмена

Нужны скрипты резервного копирования с архивацией
Привет Всем,если не трудно покидайте скрипты резервного копирования.....с архивацией

Скрипт для копирования файлов по SFTP
В общем нужен скрипт,для копирования звукозаписей с linuxs сервера по SFTP Данные для копирования берутся из файла 1(имена файлов), куда...

30
2 / 2 / 0
Регистрация: 10.12.2010
Сообщений: 29
10.12.2010, 12:59
Студворк — интернет-сервис помощи студентам
Не совсем.
1) Рекурсивно (со всеми подкаталогами) проверяется папка источник.
2) Затем, если такого файла в папке назначения нет - он туда копируется.
3) Если он там есть проверяется дата модификации и только в случае если в папке назначения более старая версия он обновляется.

Можно дописать полную синхронизацию - затем сканируется папка назначения (уже обновлённая) и те файлы, которых нету в источнике копирует назад. Вот и восстановление удалённых файлов.

Подразумевается что к папке в которую копируется (и с которой потом идёт восстановление) имеет доступ только админ.

На отдельную машину... это сложнее. Хотя в принципе реализуемо. Но тут уже с сетью придётся возиться.

Да, забыл сказать: Structure это пустой класс.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
10.12.2010, 13:09
Python
1
if ini[entry][key][0] is '"':
в третьем питоне
Python
1
2
3
4
5
6
7
8
>>> s = '"'
>>> s
'"'
>>> s is '"'
False
>>> s == '"'
True
>>>
0
2 / 2 / 0
Регистрация: 10.12.2010
Сообщений: 29
10.12.2010, 13:22
Знаю.
По этой теме подробнее здесь.
0
0 / 0 / 0
Регистрация: 09.11.2010
Сообщений: 14
13.12.2010, 12:40  [ТС]
Цитата Сообщение от accept Посмотреть сообщение
1 if ini[entry][key][0] is '"':
в третьем питоне
Код Python1
2
3
4
7
8
9
10
>>> s = '"'
>>> s
'"'
>>> s is '"'
False
>>> s == '"'
True
>>>
Что это означает?Можно по-подробней?
И еще, я заходила на ссылку, которую вы мне скинули- там, по-моему нет такой темы как мне надо(((
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
14.12.2010, 02:49
Цитата Сообщение от tasay
Что это означает?
это у него в коде проверка выполняется на основе недокументированного свойства

Python
1
dir = os.path.split(path)[-2]
тоже

там всегда разделение на два элемента
Python
1
2
3
4
5
6
7
8
9
>>> s = 'abc/def/ghi/jkl'
>>> import os
>>> os.path.split(s)
('abc/def/ghi', 'jkl')
>>> os.path.split(s)[0]
'abc/def/ghi'
>>> os.path.split(s)[-2]
'abc/def/ghi'
>>>
в help(os.path.split) написано

Python
1
2
3
            f1 = open(src_file,'rb')
            dump = f1.read()
            f2 = open(dst_file,'wb')
сначала нужно открыть оба файла, и только когда они оба открылись, читать первый файл
и читать его нужно по частям, сразу записывая, чтобы память не занимать

и похоже у него ещё нет спуска, то есть он указывает из каких каталогов копировать файлы, а там нужно копировать файлы, открывать каталоги и там тоже поиск файлов проводить, потому что каталогов там может быть много
0
2 / 2 / 0
Регистрация: 10.12.2010
Сообщений: 29
14.12.2010, 12:10
Базовый скрипт с комментариями:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import os,sys
from special import load_config_data
 
cfg = load_config_data("config.ini")
#на выходе - словарь в котором ключи -- секции, а сами секции стали экземплярами класса
#special.py я с собой из проекта в проект таскаю
 
for key in cfg:
    print "======================================================="
    src_folder = cfg[key].src #папка-источник
    dst_folder = cfg[key].dst #папка-приёмник
 
    #Рекурсивный обход директории
    for root, dirs, files in os.walk(src_folder):
      for name in files:
        src_file = os.path.join(root, name)#Полное имя
        src_time = os.path.getmtime(src_file)#Получить время модификации
        
        #Преобразовать путь-источник в путь-приёмник
        dst_file = src_file.replace(src_folder,dst_folder+"\\"+src_folder.split("\\")[-1])
        # print dst_file
        # continue
        
        if os.path.exists(dst_file):
            #если файл существует - получить время модификации
            dst_time = os.path.getmtime(dst_file)
        else:
            #иначе - получить название директории
            path = os.path.realpath(dst_file)
            dir = os.path.split(path)[-2]
            #и в случае отсутствия папок - создать их
            if not os.path.exists(dir):
                os.makedirs(dir)
            dst_time = 0 #назначить время модифификации целевого на начало компьютерной эры
        
        #если файл в папке назначения старее - перезаписать
        #[+] - файл добавлен
        #[^] - файл обновлён
        #[=] - файл пропущен ибо время модификации исходного <= назначения
        if src_time>dst_time:
            f1 = open(src_file,'rb')
            dump = f1.read()
            f2 = open(dst_file,'wb')
            f2.write(dump)
            f1.close()
            f2.close()
            sign = dst_time is 0 and "[+]" or "[^]"
            print sign, dst_file
        else:
            print "[=]", dst_file
У меня в папках нет файлов, чей объём превышает 10 метров, так что ступенчатая запись мне не нужна.
Цитата Сообщение от accept Посмотреть сообщение
и похоже у него ещё нет спуска
В смысле?
Если имелось ввиду что копируется только из корневой папки то нет -- os.walk обходит все поддиректории сколько бы их не было и дерево путей копируется в точности.
Хотя можно указать исключаемые.
0
0 / 0 / 0
Регистрация: 09.11.2010
Сообщений: 14
14.12.2010, 18:15  [ТС]
Цитата Сообщение от Eliont Посмотреть сообщение
#и в случае отсутствия папок - создать их
if not os.path.exists(dir):
os.makedirs(dir)
Обьясните пожалуйста, как это создает их?Т.е. в этом скрипте выполняется копирование не только измененных, но и удаленных файлов?А куда производится копирование?
Если ты не против, напиши мне свою аську, во многом не могу разобраться((((
и еще что означает вот это:

cfg = load_config_data("config.ini")
#на выходе - словарь в котором ключи -- секции, а сами секции стали экземплярами класса
#special.py я с собой из проекта в проект таскаю
Вы уж извините, но я действительно чайник в этом языке...
0
2 / 2 / 0
Регистрация: 10.12.2010
Сообщений: 29
14.12.2010, 21:59
Если с техническим английским нормально - тебе сюда: http://docs.python.org/
Большинство вопросов отпадут. Если нет - то есть много хороших учебников и на русском - а по ссылке именно документация.
Аськи у меня нет.

Цитата Сообщение от tasay Посмотреть сообщение
Обьясните пожалуйста, как это создает их?
У меня винда, но функция и под юниксом также работает - если путь не существует, то необходимые папки создаются.

измененных, но и удаленных файлов?
нет удалённые назад не копируются, допиши по аналогиииз


Цитата Сообщение от tasay Посмотреть сообщение
А куда производится копирование?
Цитата Сообщение от Eliont Посмотреть сообщение
dst_folder = cfg[key].dst #папка-приёмник
[pair1]
src = C:\PROJECTS
dst = C:\My Dropbox
Синхронизатор полностью:
Вложения
Тип файла: zip Synchronizator.zip (7.1 Кб, 28 просмотров)
0
0 / 0 / 0
Регистрация: 09.11.2010
Сообщений: 14
14.12.2010, 22:56  [ТС]
Цитата Сообщение от Eliont Посмотреть сообщение
def dict_from_config_file(file, raw=False, vars=None):
"""Convert an INI file to a dictionary""" #from cherrypy
inifile = ConfigParser()
inifile.read(file) # Parse config file
# Load INI file into a dict
result = dict()
for section in inifile.sections():
result[section] = dict()
for option in inifile.options(section):
v = inifile.get(section, option, raw, vars)
result[section][option] = v
return result
def load_config_data(file):
ini = dict_from_config_file(file)
dictionary = dict()
for entry in ini:
dictionary[entry] = Structure()
for key in ini[entry]:
try:
dictionary[entry].__dict__[key] = int(ini[entry][key])
except ValueError:
try:
if ini[entry][key][0] is '"':
ini[entry][key] = ini[entry][key][1:]
if ini[entry][key][-1] is '"':
ini[entry][key] = ini[entry][key][:-1]
dictionary[entry].__dict__[key] = ini[entry][key]
except IndexError:
dictionary[entry].__dict__[key] = ''
dictionary[entry].id = entry
return dictionary
С первой частью как-то разобралась....Что делает эта часть программы?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
15.12.2010, 02:16
Цитата Сообщение от Eliont
У меня винда, но функция и под юниксом также работает
Python
1
dst_file = src_file.replace(src_folder,dst_folder+"\\"+src_folder.split("\\")[-1])
os.path.join() автоматически определяет разделитель, как и os.path.split()

иначе
Python
1
2
3
4
5
6
>>> import os
>>> os.path.exists('/etc\\profile')
False
>>> os.path.exists('/etc/profile')
True
>>>
Цитата Сообщение от Eliont
Если имелось ввиду что копируется только из корневой папки то нет -- os.walk обходит все поддиректории
это мне показалось

Цитата Сообщение от Eliont
У меня в папках нет файлов, чей объём превышает 10 метров
видео часто превышает и больше, а в ini можно указать путь и к видео
прикинь, там гектар, а ты его весь в память

Python
1
sign = dst_time is 0 and "[+]" or "[^]"
будет совпадать из-за is
Python
1
sign = not dst_time and "[+]" or "[^]"
так будет точно

Python
1
2
3
4
5
>>> dst_time = 0
>>> sign = ('[+]', '[^]')[dst_time]
>>> sign
'[+]'
>>>
1
2 / 2 / 0
Регистрация: 10.12.2010
Сообщений: 29
16.12.2010, 16:37
Резонно.
Появится время, надо будет доработать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.12.2010, 16:37
Помогаю со студенческими работами здесь

Скрипт резервного копирования
Помогите, пожалуйста, написать скрипт резервного копирования заданной директории, имя архива должно содержать текущую дату. Буду очень...

Покритикуйте мой скрипт резервного копирования файлов
Покритикуйте мой скрипт, создающий резервные копии всех файлов текущего каталога и перемещающий их в новый каталог. #!/bin/sh ...

Не работает скрипт резервного копирования для новых файлов
find . -type f -mtime -10 -print0 | xargs -0 tar -cjf archive.tar.bz2 Не пашет на рабочем проект (добавилось порядка 2к картинок) -...

Скрипт автоматизации резервного копирования баз данных Firebird/InterBase
Опубликовал статью в блоге Комплексная автоматизация резервного копирования баз данных Firebird/InterBase на Windows-серверах. Возможно...

Скрипт "Утилита резервного копирования"
Создать bat с 2-мя параметрами. Первый - адрес каталога, второй - адрес создания резервной копии. Всё должно быть заархивировано. Название...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru