Доброго времени суток! Я тут решил начать писать в 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, за примеры по перемещению файлов. |