#!/usr/bin/perl # версия 1.2 # исправления, по сравнению с предыдущей версией: # + изменен анализ XML, вследствии чего скрипт, должен работать с любыми ЦОР, однако потребуется доустановить пакет # perl-XML-DOM из репозитория. # + Убрана возможность задания каталога для временного хранения файлов, так как некоректное задание пользователем приводило к самым # неожиданным последствиям. # + Исправлена ошибка, когда скрипт пытался создать каталог с недопустимыми символами. # + Изменены сообщения об ошибках # OS - LINUX, сист. требования - PERL, UNZIP, кодировка локали utf-8, perl-XML-DOM. # Этот скрипт распаковывает архивы с файлами ЦОР в заданной директории, # переименовывает папки с распакованными материалами в понятный вид и сортирует # в три директории Интерактивы, Иллюстрации, Прочие. # Прошу строго не судить скрипт я не программист. # А скрипт этот был написан потому, что диски с ЦОР в Linux использовать крайне не удобно, # т.к. архивы имеют названия по которым не определить что внутри. Вручную перебрать даже 200 архивов очень затруднительно. Что касается работы в 1С:Образование 4 под Windows, то она работает крайне медленно на слабых машинах, # а так ресурсы можно использовать стандарными средствами ОС. # файл .dcr можно открыть: # * Web-браузер с подключаемым модулем Adobe Shockwave Player # * dirOpener # Автор пользователь DEN2007 с www.linformatika.ru #P.S. Хочется конечно большего, к сожалению времени у меня постоянно не хватает, однако по мере возможности скрипт будет дорабатываться. # Выставьте свои параметры. $in='/media/cdrom/'; # Указание директории с архивами ЦОР. $out='/home/denis/cor2/'; # Указание пустой директории для распакованных ЦОР. #---------------!!!!!!!!!!!!!!!!!не изменять!!!!!!!!!!!!!!!!!------------------------------------------ #****************************************************************************************************** $tmp='/tmp/edu_zip/'; system"rm -R -f /tmp/edu_zip"; if(!-e "$out"){ print"Указанная директория\n$out\nдля преобразованных ЦОР не существует.\n";exit;} if(!-e "$in"){ print"Указанная директория\n$in\nc ресурсами ЦОР не существует.\n";exit;} mkdir "${out}Иллюстрации" or die "Каталоги:\n${out}Иллюстрации\n${out}Интерактив\n${out}Прочие\n уже существуют.\nЗадайте пустой каталог для распакованных ЦОР\nили удалите указанные каталоги, если предыдущий запуск скрипта завершился ошибкой.\n"; mkdir "${out}Интерактивы" or die "Каталоги:\n${out}Иллюстрации\n${out}Интерактив\n${out}Прочие\n уже существуют.\nЗадайте пустой каталог для распакованных ЦОР\nили удалите указанные каталоги, если предыдущий запуск скрипта завершился ошибкой.\n"; mkdir "${out}Прочие" or die "Каталоги:\n${out}Иллюстрации\n${out}Интерактив\n${out}Прочие\n уже существуют.\nЗадайте пустой каталог для распакованных ЦОР\nили удалите указанные каталоги, если предыдущий запуск скрипта завершился ошибкой.\n"; mkdir "$tmp" or die "$!"; opendir DIR, "$in" if -e "$in" or die "not open $in"; @zip= grep /^(DL_RES)|(dl_res).{5,}zip$/,readdir DIR; closedir(DIR); for($i=0;$iparse(\*LOM); my $root=$lom->getElementsByTagName('general')->item(0); my $List=$root->getChildNodes(); for my $i (1 .. $List->getLength -1 ){ my $general = $List->item($i); next unless ($general->getNodeName eq 'description'); my $info=$general->getElementsByTagName('string'); $description= $info->item(0)->getChildAtIndex(0)->getData(); $description=~s/[^\w\s]//g; } for my $i (1 .. $List->getLength -1 ){ my $general = $List->item($i); next unless ($general->getNodeName eq 'title'); my $info=$general->getElementsByTagName('string'); $title= $info->item(0)->getChildAtIndex(0)->getData(); $title=~s/[^\w\s]//g; } } sub group{ if($description=~/Интерактив/i){$group='Интерактивы';} elsif($description=~/Иллюстрация/i){$group='Иллюстрации';} else{$group='Прочие';} } sub copy{ opendir DIR, "$tmp$name" if -e "$tmp$name" or die "not open $tmp$name"; @files= grep !/(\.xml$)|(^\.)/,readdir DIR; closedir(DIR); $outdir="${out}$group/$title"; $g='1'; if(-e "$outdir"){mkdir "${out}$group/${title}_$g"; $g++;} else{mkdir "${out}$group/$title";$g='1';} foreach (@files){ print"copy in $tmp$name/$_ $out$group/$title/$_\n"; #rename ("$tmp$name/$_", "$out$group/$title/$_"); system("cp -r \"$tmp$name/$_\" \"$out$group/$title/$_\"\n"); } }