Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Скрипт Резервного Копирования


Автор: birdfree 28.3.2010, 17:29
Доброго времени суток!
Я тут решил начать писать в Perl скажу честно пишу всего около суток, так что пожалуйста не судите особо строго. Вот я решил выложить свое первое творение скрипт для резервного копирования папок с последующем сжатием их в zip архив. Скрипт запускается на флешке не которую нужно копировать файлы резервной копии. Вот прошу посмотреть, высказать свое мнение, внести улучшения. 

Код

############################################################
#Получение текущей даты
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=gmtime(time);
 
my $date = sprintf("%d.%02d.%02d_%02d-%02d-%02d",$year+1900,$mon+1,$mday,$hour,$min,$sec);
print "Date is $date\n";
############################################################
use strict;
use warnings;
use locale;
use File::Basename;
use Cwd; # модуль для определения текущего рабочего каталога
############################################################
my ($startdir) = &cwd; # запомнить, откуда мы начали
print "$startdir\n";
##############################################################
#поиск файла-маркера для определения место резервного копирования

#############################################################
#Перемещение старых бэкапов в соответсвующие папки
#Удаляем все zip файлы из папки \backup_old_3
while(<$startdir/backup_old_3/*.zip>){
do{unlink $_ or die "cant remove: $!"} if m!.*\.zip$!;
print $_," Deleted!\n";

#Перемещаем все zip файлы из папки \backup_old_2 в \backup_old_3
foreach my $oldname(<$startdir/backup_old_2/*.zip>)
{
    my $newname = "$startdir/backup_old_3/" . basename($oldname);
    rename ($oldname, $newname);
}
#Перемещаем все zip файлы из папки \backup_old_1 в \backup_old_2
foreach my $oldname(<$startdir/backup_old_1/*.zip>)
{
    my $newname = "$startdir/backup_old_2/" . basename($oldname);
    rename ($oldname, $newname);
}
#Перемещаем все zip файлы из папки \backup в \backup_old_1
foreach my $oldname(<$startdir/backup/*.zip>)
{
    my $newname = "$startdir/backup_old_1/" . basename($oldname);
    rename ($oldname, $newname);
}
while(<$startdir/backup/*.zip>){
do{unlink $_ or die "cant remove: $!"} if m!.*\.zip$!;
print $_," Deleted!\n";
}
#############################################################

#Первый путь резервного копирования
my $directory_for_backup1 = 'c:/niao/test_data/'; 
#Первый Архив
my $backup_zip_file1 = "$startdir/backup/$date.first.zip"; 
#Второй путь резервного копирования
my $directory_for_backup2 = 'c:/niao/test_data_2/';
#Второй Архив
my $backup_zip_file2 = "$startdir/backup/$date.second.zip"; 
############################################################
$| = 1; # отключаем буферизацию ввода/вывода
############################################################
#Создание Первого Архива
print "\n!\n";
use Archive::Zip qw( :ERROR_CODES );
print "Directory backup...\n";
my $zip = Archive::Zip->new();
$zip->addTree($directory_for_backup1);
if ($zip->writeToFileNamed($backup_zip_file1) == AZ_OK ) {
    print "The Backup done.\n\n";
}
else {
    print "CAN'T WRITE BACKUP ZIP FILE ($backup_zip_file1): $!\n\n";
}
############################################################
#Создание Второго Архива
print "\n!\n";
use Archive::Zip qw( :ERROR_CODES );
print "Directory backup...\n";
#Вот тут исключаем типы файлы из архивирования: то есть при архивировании эти файлы будут пропущены
# Если заменить /\.bk$/ на /\.bk$/i, и в этом случае не будет чувствителен к регистр
$zip->addTree($directory_for_backup2, '', sub {!/\.rar$/i && !/\.bk$/i && !/name\.if$/i && !/\.ls/i && !/\.\$l$/i});
if ($zip->writeToFileNamed($backup_zip_file2) == AZ_OK ) {
    print "The Backup done.\n\n";
}
else {
    print "CAN'T WRITE BACKUP ZIP FILE ($backup_zip_file2): $!\n\n";
}
############################################################
 

как видите скрипт не много кривоват, по этому я и хочу узнать мнение общественности. И еще хотел бы спросить можно ли было как ни будь сделать отображение процесса архивирования, то есть сколько % упаковано то есть что то типа прогресс бара. Этот скрипт я писал с намеком на кроссплатформенность так что мое пожелание что бы он таким и оставался)) 

За помощь в создании этого творения я благодарю amg, за то что он рассказал как можно архивировать с исключением файлов по маске. Так же я благодарю Egik2 и Pfailed, за примеры по перемещению файлов. 

Автор: arto 28.3.2010, 18:26
3 копии одного постинга -- это для резервного копирования?

Автор: birdfree 28.3.2010, 18:37
Я извиняюсь но сам не понимаю почему так получилось. Я только один пост писал. И делал один просмотр. Попрощу модерацию удалить 2 прошлых поста.
И еще у меня тут проблема появилось в скрипте, нужно сделать что бы при архивации можно было исключать файлы по маске для примера исключать: *.ls *.bk *.div *text.bk name*.ff Если помножите буду очень благодарен  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)