<
  • Главная
Статьи

Автоматичне перейменування файлів відповідно до їх вмістом

  1. Інструкція користувача
  2. модулі
  3. Як ще можна використовувати програму
  4. джерела

Потрібно було перейменувати кожен файл відповідно до його заголовком - текстом, що з'являються в заголовку вікна браузера при перегляді файлу; в самому HTML-документі він вказується між тегами. Тоді відразу було б видно, що в якомусь файлі знаходиться.

Файлів було багато, і перейменовувати їх вручну, звичайно, не хотілося, тому я написав просту програму на Perl (ActivePerl 5.8.6.811 для Windows). При її запуску в командному рядку вказувався каталог для обробки, і програма перейменовувала в ньому всі файли з розширенням htm відповідно до їх заголовками.

Таким чином, поставлена ​​задача була вирішена. Але я не зупинився на цьому і продовжив розширення можливостей, винісши тіло підпрограми get_title в окремий файл (модуль). Змінивши цю підпрограму і вказавши її ім'я при запуску, можна розширити функціональність - обробляти з її допомогою не тільки HTML-файли, але і інші.

Програма завантажує її текст в змінну $ get_title, а коли приходить час виконувати підпрограму get_title, то за допомогою функції eval (наявність її в Perl вельми зручно) якраз і інтерпретується той текст, що був в цій змінній.

У самому підключається модулі для обробки HTML-файлів (html.plg) я також додав функцій: тепер він може працювати з файлами не тільки в кодуванні Windows-1251, а й в KOI8-R (перекодіруя повертається заголовок в Windows-1251). Причому якщо кодування не вказана в HTML-документі явно, модуль намагається визначити її автоматично, вважаючи, що це Windows-1251 або KOI8-R і використовуючи найпростіший алгоритм, описаний в роботі [2] (див. Також коментар в тексті модуля).

Само собою зрозуміло, що після таких нововведень розширення імені файлів, що обробляються програмою, вже не могло бути обмежена одним htm, адже з'явилася можливість обробки і інших типів (та й HTML-файли можуть бути названі по-іншому: html, phtml, shtml .. .). Тому я передбачив вказівку одного або декількох розширень в командному рядку, а для обробки файлів з будь-якими розширеннями можна задати символ «зірочка» ( «*»).

Іноді буває потрібно обробити файли, що знаходяться не тільки в зазначеному каталозі, а й у всіх його підкаталогах (рекурсивно), т. Е. Обробити відразу цілу гілку дерева каталогів. А деколи потрібно обробити лише один конкретний файл. Ці функції також були додані. Крім того, була передбачена відміна перейменування файлів, для чого в кожному каталозі, де хоча б один файл був перейменований, створюється спеціальний perl-скрипт, який, будучи запущений користувачем, виконає зворотне перейменування файлів (поверне їм колишні імена). Така можливість підвищує безпеку використання програми (якщо раптом ви, скажімо, перейменувати не ті файли, то потім зможете повернути все назад). Корисна вона і при налагодженні власних модулів. Зрозуміло, її можна і відключити, вказавши відповідну опцію в командному рядку.

Коли з яких-небудь причин потрібно зберегти оригінальні імена файлів (скажімо, якщо є група HTML-файлів, пов'язаних гіперпосиланнями, адже при перейменуванні файлів гіперпосилання стануть недійсними) і разом з тим потрібно швидко дізнатися, що міститься в кожному з них, то передбачена можливість замість перейменування додавати в якості описів витягнуті з файлів заголовки в файл descript.ion, що знаходиться в одному з ними каталозі (якщо такого файлу немає, він створюється). Нагадаю, що файл descript.ion - текстовий, що містить однорядкові опису файлів, що знаходяться в одному з ним каталозі. У таких файлових менеджерах, як Far, Dos Navigator, можна включити такий режим відображення, при якому поряд з іменами файлів показуються їх опису, взяті з цього файлу. (На малюнку показано, як це виглядає в Dos Navigator при максимізувати поточний панелі.)

)

Також був розроблений модуль mmodules.plg, який повертає назву композиції, витягнуте з музичного файлу в форматі IT, XM, S3M, MOD. Так, вже існує спеціальна програма для перейменування музичних файлів відповідно до назв композицій (MODNamer by Mauro? DjM? Molinari), що підтримує до того ж більше типів файлів. Але робота описуваної програми з вищезазначеним підключається модулем має свої переваги: ​​передача аргументів через командний рядок, скасування перейменування, додавання назви композицій в якості описів файлів в файл descript.ion. (Текст описуваної програми см. На «Мир ПК-диску».)

Інструкція користувача

Формат команди запуску програми (в квадратних дужках - обов'язкові елементи, в фігурних дужках - необов'язкові):
[Ім'я файлу з інтерпретатором 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 ім'я файлу, то безглуздо додавати в файл описів запис про цей файл (що складається з власне імені файлу і опису); в цьому випадку програма виводить відповідне повідомлення.

Коли ж у файлі описів вже є інформація про оброблюваному файлі, то нові дані все одно будуть додані, а старе не сумнівайся (я не став ускладнювати програму).

І ще про описи. Щоб в Dos Navigator включити в поточній панелі режим перегляду описів файлів, треба натиснути +. А щоб максимізувати панель (див. Малюнок) - + +. Можна повернутися до початкового режиму відображення, повторно натиснувши ці комбінації клавіш. Якщо ви застосовуєте Far, то для включення режиму «Опису» використовуйте комбінацію ліва клавіша +6, а для включення режиму «Довгі опису» - ліва +7; повернутися же до звичайного режиму відображення ( «Середній режим») можна за допомогою лівої +2.

Нижче наведено приклад сеансу роботи з програмою, коли виконується перейменування файлів.

C: WORKTEST> perl c: m_renamem_rename.pl c: m_renamehtml.plg. htm Multi-Rename 1.0 (c) Ivan Roshin, Moscow, 11 Oct 2005 E-mail: [email protected] WWW: http://www.ivr.da.ru Renaming file (s): .1.htm => Заголовок.htm .2.htm
І ще приклад для випадку, при якому програма НЕ перейменовує файли, а записує їх опису в файл descript.ion. C: WORKTEST> perl c: m_renamem_rename.pl / d c: m_renamehtml.plg. htm Multi-Rename 1.0 (c) Ivan Roshin, Moscow, 11 Oct 2005 E-mail: [email protected] WWW: http://www.ivr.da.ru Getting description (s): .1.htm : Тема .2.htm
Програма завершується з нульовим кодом виходу, якщо були оброблені всі файли, і з ненульовим, якщо відбулося дострокове припинення роботи через фатальної помилки (скажімо, при запуску були вказані в повному обсязі необхідні аргументи, або не вдалося прочитати модуль, або виявилася синтаксична помилка при його виконанні ...).
Зауважу, що при помилку, пов'язаної з поточним оброблюваних файлом, наприклад, не вдалося його відкрити або виявилося, що він не містить заголовка, то програма виводить повідомлення про це (див. Наведені вище приклади сеансів роботи з програмою) і продовжує обробляти такі файли ( тобто така помилка не вважається фатальною і не призводить до ненульова коду виходу).
При нормальному завершенні роботи видаються відомості про загальну кількість оброблених файлів і про те, скільки з них було оброблено успішно, а скільки - ні.

модулі


Модуль, що підключається до програми, є текстовий файл з розширенням plg (воно не перевіряється і в принципі може бути іншим). Перший рядок даного файлу служить для його ідентифікації і повинна бути такою: «# Plugin for Multi-Rename 1.0». Програма перевіряє цей рядок, щоб не завантажити щось інше, якщо користувач помилився при вказівці імені. Як я вже згадував, в модулі знаходиться тіло підпрограми get_title, яка отримує ім'я оброблюваного файлу, аналізує його вміст і в підсумку повинна повернути такі три значення:

  • код виходу (0 - заголовок витягнутий, 1 - була помилка);
  • сам заголовок в кодуванні Windows-1251 або порожній рядок, якщо він не був витягнутий;
  • текст повідомлення про помилку, через яку заголовок не вдалося витягти (також в кодуванні Windows-1251), або, якщо помилки не було, порожній рядок.

Всі використовувані в підключається модулі змінні повинні бути в ньому оголошені, щоб запобігти можливому конфлікту з однойменними змінними основної програми (та й директива «use strict» вимагає, щоб всі використовувані змінні були оголошені).

Нижче наведені вихідні тексти двох модулів, про які я вже розповідав вище: html.plg (для обробки HTML-файлів) і mmodules.plg (для обробки музичних модулів). Вони також можуть стати в нагоді в якості прикладів при створенні власних підключаються оброблювачів текстових або двійкових даних. (Їх текст див. На «Мир ПК-диску».)

Як ще можна використовувати програму

Взагалі кажучи, модуль зовсім не обов'язково повинен повертати заголовок, витягнутий із зазначеного файлу. Для формування результуючого рядка він може взяти за основу, скажімо, ім'я цього файлу. Отже, якщо вам треба перейменувати файли так, щоб нове ім'я за певними правилами формувалося з старого, також можна написати модуль.

Розглянемо приклад. Нехай вихідні імена файлів виглядають так:
11062005.txt, 15062005.TXT і т.п., тобто ім'я позначає якусь дату (перші дві цифри - число, другі дві - місяць, що залишилися чотири - рік), а розширення - txt без урахування контексту.

Потрібно перейменувати файли так, щоб вийшло навпаки: спочатку в імені розташовувався рік, потім місяць, а потім число (скажімо, при сортуванні файлів по іменах може знадобитися, щоб вони розташовувалися по зростанню дати, зазначеної в імені).

Плагін (файл date.plg) буде таким:

# Plugin for Multi-Rename 1.0 # (c) Ivan Roshin, Moscow, 27 Sep 2005. if ($ _ [0] = ~ m / (?: ^ | [:]) (D {2}) (d {2 }) (d {4}). txt $ / i) {return (0, $ 3. $ 2. $ 1, ''); } Else {return (1, '', 'Error: incorrect name!'); }

Як він працює? Спочатку за допомогою регулярного виразу перевіряється, чи перебуває ім'я файлу з восьми цифр і є розширення txt, без урахування регістру. Якщо все виявиться так, як потрібно, то у вбудованих змінних $ 1, $ 2 і $ 3 запам'ятаються витягнуті з імені число, місяць і рік відповідно і модуль поверне в якості заголовка, витягнутого з файлу, рядок, що складається з цих змінних, розташованих уже в зворотному порядку (рік, місяць, число). Якщо ж йому було передано не таке ім'я файлу, як передбачалося за умовами завдання, то він видасть повідомлення про помилку. Як бачимо, все досить просто.

Ще один приклад. Припустимо, в якомусь каталозі знаходяться файли, імена яких розрізняються тільки числом в кінці - порядковим номером файлу (зокрема, ім'я може складатися лише з порядкового номера), наприклад, name1, name2, ..., name38. Якщо при перегляді каталогу файли поділяються на категорії за іменами, то їх порядок буде таким: name1, name10, name11 ... А хотілося б бачити «природний» порядок, при якому файли розташовуються по зростанню своїх номерів. Щоб домогтися бажаного, слід змінити порядкові номери в іменах файлів так, щоб у всіх цих номерах було однакове число цифр. Тоді впорядкування файлів по іменах дасть потрібний результат: name01, name02, ..., name38.

Нехай максимальний порядковий номер файлу містить n цифр (в нашому випадку цей номер - 38, дві цифри). Тоді імена файлів необхідно змінити так: якщо в порядковому номері менше n цифр, то потрібно вставити перед ними стільки нулів, скільки буде потрібно для того, щоб загальна кількість цифр стало рівним n.

Саме така зміна імені файлу і виробляє наведений нижче модуль (файл ext_num. Plg). Перед його використанням слід встановити в тексті бажане значення n в якості початкового значення змінної $ n.

# Plugin for Multi-Rename 1.0 # (c) Ivan Roshin, Moscow, 27 Sep 2005. my $ n = 2; # До скількох цифр розширювати порядковий номер. my $ name; # Ім'я оброблюваного файлу (без шляху, без # розширення). # Отримуємо $ name. if ($ _ [0] = ~ m /([^:]*).[^:]*$/) # Якщо є розширення. {$ Name = $ 1; } Else # Пусте розширення. {$ _ [0] = ~ m / [^:] * $ /; $ Name = $ &; } # Обробляємо $ name. if ($ name = ~ m / d + $ /) # Якщо є цифри в кінці. {My $ k = $ n-length ($ &); if ($ k> 0) # Якщо треба додавати нулі. {$ Name = ~ s / d + $ / ( '0'x $ k). $ & / E; } Return (0, $ name, ''); } Else # Некоректне ім'я: не містить цифр в кінці. {Return (1, '', 'Error: incorrect name!'); }

джерела

  1. Специфікація HTML 4.01. http://pyramidin.narod.ru/html401/index.htm
  2. Рощин І. Додавання в HTML-документи інформації про їх кодуванні // Радіомір. Ваш комп'ютер. 2003. №10. http://ivr.webzone.ru/articles/charset
  3. Опис формату модулів Impulse Tracker. Файл ittech.txt з комплекту поставки Impulse Tracker 2.14.
  4. XM module format description for XM files version $ 0104. Файл xm.txt з комплекту поставки Fast Tracker 2.09.
  5. Scream Tracker 3.20 File Formats And Mixing Info. Файл tech.doc з комплекту поставки Scream Tracker 3.21.
  6. Anodyne. Формат MOD-файлів і технологія їх відтворення. http://www.codenet.ru/progr/formt/mod1.php

ПРО АВТОРА
Іван Рощин - автор понад 80 статей і ряду вільно розповсюджуваних програм для ZX Spectrum і PC, http://www.ivr.da.ru .

MODNamer by Mauro?
DjM?
Htm, html, shtml ?
У ньому може бути зазначено і пусте розширення: так,?
Htm?
Визначає пусте розширення і?
Htm ?
Обто ?
До речі, чому для зворотного перейменування створюється саме perl-скрипт, а не просто bat-файл?


Новости
  • Виртуальный хостинг

    Виртуальный хостинг. Возможности сервера распределяются в равной мере между всеми... 
    Читать полностью

  • Редизайн сайта

    Редизайн сайта – это полное либо частичное обновление дизайна существующего сайта.... 
    Читать полностью

  • Консалтинг, услуги контент-менеджера

    Сопровождение любых интернет ресурсов;- Знание HTML и CSS- Поиск и обновление контента;-... 
    Читать полностью

  • Трафик из соцсетей

    Сравнительно дешевый способ по сравнению с поисковым и контекстным видами раскрутки... 
    Читать полностью

  • Поисковая оптимизация

    Поисковая оптимизация (англ. search engine optimization, SEO) — поднятие позиций сайта в результатах... 
    Читать полностью