Автоматично преименуване на файлове според тяхното съдържание, World of PC, издателство „Open
По някакъв начин се сблъсках с тази ситуация: имах директория с Windows-1251 кодирани HTML файлове, чиито имена (index.htm, index(1).htm, index(2). htm. ) не казваха нищо за тяхното съдържание.
Имаше много файлове и, разбира се, не исках да ги преименувам ръчно, затова написах проста програма на Perl (ActivePerl 5.8.6.811 за Windows). При стартиране на командния ред беше зададена директорията за обработка и програмата преименува всички файлове с разширение htm в нея в съответствие с техните хедъри.
Така задачата беше решена. Но не спрях дотук и продължих да разширявам възможностите, като преместих тялото на рутината get_title в отделен файл (plug-in). Като промените тази подпрограма и посочите нейното име при стартиране, можете да разширите функционалността - използвайте я за обработка не само на HTML файлове, но и на други.
Програмата зарежда своя текст в променливата $get_title и когато дойде време да се изпълни подпрограмата get_title, функцията eval (която е много удобна в Perl) интерпретира текста, който е в тази променлива.
От само себе си се разбира, че след такива нововъведения разширението на името на файловете, обработвани от програмата, вече не може да бъде ограничено до един htm, тъй като стана възможно да се обработват други типове (и HTML файловете могат да бъдат именувани по различен начин: html, phtml, shtml.). Затова предвидих да посочите едно или повече разширения в командния ред и за да обработвате файлове с всякакви разширения, можете да посочите знака звездичка ("*").
Понякога е необходимо да се обработват файлове, които са не само в посочената директория, но и във всички нейни поддиректории (рекурсивно), т.е. да се обработва целия клон наведнъждърво на директориите. И понякога трябва да обработите само един конкретен файл. Тези функции също са добавени. Освен това беше осигурена отмяна на преименуването на файлове, за което се създава специален perl скрипт във всяка директория, където е преименуван поне един файл, който, когато се стартира от потребителя, ще преименува файловете обратно (връща предишните им имена). Тази функция повишава сигурността при използването на програмата (ако внезапно, да речем, преименувате грешните файлове, тогава ще можете да върнете всичко обратно по-късно). Също така е полезно при отстраняване на грешки на вашите собствени добавки. Разбира се, той може да бъде деактивиран и чрез указване на подходящата опция в командния ред.

Ние също така разработихме плъгина mmodules.plg, който връща заглавието на песен, извлечено от музикален файл във формат IT, XM, S3M, MOD. Да, вече има специална програма за преименуване на музикални файлове според заглавията на песните (MODNamer от Mauro ?DjM? Molinari), която също поддържа повече типове файлове. Но изпълнението на описаната програма с гореспоменатия плъгин има своите предимства: предаване на аргументи през командния ред, отмяна на преименуването, добавяне на имена на песни като описания на файлове във файла descript.ion. (За текста на описаната програма вижте "PC-Disk World".)
Упътване за употреба
Форматът на командата за стартиране на програмата (задължителни елементи в квадратни скоби, незадължителни елементи във къдрави скоби): [име на файла с интерпретатора на Perl] [име на файла с програмата] [име на файла с приставката] [име на обработения файл]
В този случай програмата ще обработи един определен файл. И да обработва всички файлове с дадени разширения, намиращи се в определена директория, в командния редред, вместо последния елемент (името на обработения файл), трябва да посочите други два елемента: [име на директорията с обработените файлове] [списък с разширения на обработените файлове]
Списъкът с разширения се състои от елементи, разделени със запетаи (без интервали), като например ?htm,html,shtml?. Може да съдържа и празно разширение: така, ?,htm? дефинира празно разширение и ?htm?. Списъкът, разбира се, може да съдържа само една звездичка ("*"), съответстваща на всяка комбинация от знаци. Не можете да посочите разширение, което съдържа запетая (но се надяваме, че няма да попаднете в тази ситуация). Кавичките около списъка са задължителни, ако той се състои само от празно разширение (т.е. ??) или ако някое от разширенията съдържа интервал.
Всеки елемент от командата за стартиране, който има формата "име на файл" или "име на директория", може също да включва пътя към този файл (директория). Ако командата не посочи всички необходими аргументи на програмата, програмата ще покаже кратка помощ за работата с нея.
Сега разгледайте опциите, посочени при стартиране. Те могат да бъдат изброени в произволен ред, регистърът на буквите в имената им не е важен.
Опцията "/r" е рекурсивно преминаване на поддиректории. Позволява ви да обработите цял клон от тяхното дърво наведнъж.
Опцията "/n" - не създавайте файла "_back_rename.pl" (това е perl скрипт за отмяна на преименуването). По подразбиране програмата го създава във всяка директория, където е преименувала поне един файл. Освен това, ако директорията вече има такъв скрипт, програмата няма да го презапише, а ще го създаде с името "_back_rename (1).pl" и т.н. По този начин е възможно многоетапно анулиране.
Между другото, защо за обратното преименуване се създава perl скрипт, а не просто bat файл? Всичко е свързано с проблеми с кодирането. В рамките на програмата (и в рамките на генерирания Perl скрипт), именатафайловете се съхраняват в Windows-1251 кодиране, докато bat файловете използват CP866 кодиране. Точното преобразуване от Windows-1251 в CP866 е невъзможно поради факта, че наборите от знаци в тези кодировки не съвпадат.
Опция "/d" - вместо да преименува файлове, програмата ще добави заглавките им като описания към файла descript.ion, намиращ се в директорията с обработваните файлове (когато няма такъв, той се създава). Разбира се, ако програмата обработва повече от една директория (т.е. опцията "/r" е зададена), тогава всяка директория ще има свой собствен descript.ion файл.
Командата за стартиране изглежда е подредена. Сега нека разгледаме по-отблизо как работи програмата. Когато показва имена на файлове или описания, вместо някои знаци можете да видите защриховани правоъгълници: това означава, че програмата не може да прекодира този знак от Windows-1251 (имената на файловете и описанията се съхраняват в това кодиране) в CP866 (показва се на екрана).
Когато преименува файлове, програмата, ако е необходимо, съкращава заглавката, извлечена от файла, така че дължината му да не надвишава максималната дължина (128 знака по подразбиране, тази стойност се съхранява в променливата $max_n_len). Освен това, ако заглавката съдържа знаци, които не са разрешени в името на файла ( / : * ? ", както и знаци с кодове 0-31), те ще бъдат заменени с "_".
Когато новото име на файл (т.е. име и разширение) е същото като друг файл (или директория) в същата директория, поднизът "(1)" се добавя към новото име (преди разширението), за да се избегне конфликт. Ако вече се използва такова име, тогава вместо „(1)“ се добавя „(2)“ и т.н. Разширението на преименувания файл остава същото като оригиналния.
В случай на добавяне на описание към файла descript.ionпрограмата, ако е необходимо, съкращава описанието, така че дължината му да не надвишава максималната дължина (по подразбиране е 256 знака, тази стойност се съхранява в променливата $max_d_len). Ако заглавието съдържа символи, които не са позволени в описанието (знаци с кодове 0,10,13 се считат за такива), те ще бъдат заменени с "_".
Тъй като кодирането на файла с описание е CP866 и описанията се съхраняват в програмата в Windows-1251, те се прекодират по време на запис. Освен това, вместо знаци, които програмата не може да прекодира, псевдографичните знаци са написани под формата на защриховани правоъгълници.
Ако програмата не може да прекодира името на файла в CP866, тогава няма смисъл да добавяте запис за този файл към файла с описание (състоящ се от действителното име на файла и описание); в този случай програмата показва подходящо съобщение.
Когато файлът с описание вече съдържа информация за обработвания файл, новите данни все още ще бъдат добавени, а старите няма да бъдат изтрити (не усложних програмата).
Следва пример за сесия с програмата, когато файловете се преименуват.
И още един пример за случая, в който програмата не преименува файлове, а записва техните описания във файла descript.ion.
Програмата излиза с нулев изходен код, ако всички файлове са били обработени, и с различен от нула изходен код, ако е прекъсната по-рано поради фатална грешка (да речем, че не всички необходими аргументи са били предоставени при стартиране, или добавка не може да бъде прочетена, или е възникнала синтактична грешка, докато се изпълнява. ).
Отбелязвам, че в случай на грешка, свързана с текущия файл, който се обработва, например, не е възможно да се отвори или се оказа, че не съдържа заглавка, програмата показва съобщение за това (вижте примерите за работни сесии, дадени по-горес програмата) и продължава да обработва следните файлове (т.е. такава грешка не се счита за фатална и не води до ненулев изходен код).
При нормално изключване се предоставя информация за общия брой обработени файлове и колко от тях са обработени успешно и колко не.
Плъгини
Модулът, свързан с програмата, е текстов файл с разширение plg (не се проверява и по принцип може да е различно). Първият ред на този файл се използва за идентифицирането му и трябва да бъде: "# Plugin for Multi-Rename 1.0". Програмата проверява този ред, за да не зареди нещо друго, ако потребителят е направил грешка при посочване на името. Както вече споменах, модулът съдържа тялото на подпрограмата get_title, която получава името на файла, който се обработва, анализира съдържанието му и като резултат трябва да върне следните три стойности:
- код за изход (0 - хедърът е извлечен, 1 - има грешка);
- самата заглавка в Windows-1251 кодиране или празен низ, ако не е извлечен;
- текстът на съобщението за грешка, поради което заглавката не може да бъде извлечена (също в Windows-1251 кодиране), или, ако няма грешка, празен низ.
Всички променливи, използвани в плъгина, трябва да бъдат декларирани в него, за да се предотврати възможен конфликт с променливите със същото име в основната програма (и директивата „use strict“ изисква всички използвани променливи да бъдат декларирани).
По-долу са изходните кодове за двете добавки, които споменах по-горе: html.plg (за обработка на HTML файлове) и mmodules.plg (за обработка на музикални модули). Те също могат да бъдат полезни като примери, когато създавате свои собствени модули за обработка на текст или двоични данни. (техният текствижте "PC-Disk World".)
Как иначе можете да използвате програмата
По принцип не е необходимо приставката да връща заглавка, извлечена от посочения файл. За да формира резултантния низ, той може да вземе като основа, да речем, името на този файл. Ето защо, ако трябва да преименувате файлове, така че новото име да се формира от старото според определени правила, можете също да напишете плъгин.
Помислете за пример. Нека оригиналните имена на файловете да изглеждат така: 11062005.txt, 15062005.TXT и т.н., т.е. името представлява определена дата (първите две цифри са деня, вторите две са месеца, останалите четири са годината), а разширението е txt, без значение за малки и големи букви.
Трябва да преименувате файловете така, че да се окаже обратното: първо годината е в името, след това месецът и след това числото (например, когато сортирате файловете по име, може да искате те да бъдат подредени във възходящ ред на датата, посочена в името).
Добавката (файл date.plg) ще бъде така:
Как работи той? Първо, използвайки регулярен израз, той проверява дали името на файла се състои от осем цифри и дали има разширение .txt, без значение за главни и малки букви. Ако всичко се окаже както трябва, тогава вградените променливи $1, $2 и $3 ще запазят съответно деня, месеца и годината, извлечени от името, и модулът ще върне като заглавка, извлечена от файла, низ, състоящ се от тези променливи вече в обратен ред (година, месец, ден). Ако му е дадено име на файл, което не е същото, както се предполага от условията на задачата, тогава ще издаде съобщение за грешка. Както можете да видите, всичко е съвсем просто.
Нека максималният сериен номер на файла съдържа n цифри (в нашия случай това число е 38, две цифри). След това имената на файловете трябва да се променят по следния начин: if in ordinalчислото е по-малко от n цифри, тогава трябва да вмъкнете толкова нули пред тях, колкото е необходимо, за да направите общия брой цифри равен на n.
Именно тази промяна в името на файла прави плъгинът по-долу (файл ext_num.plg). Преди да го използвате, трябва да зададете желаната стойност на n в текста като начална стойност на променливата $n.