![]() ![]() |
|
1 | |
XRENN - переименование файлов с использованием регулярных выражений13.07.2014, 00:27. Показов 7206. Ответов 24
Автор: Smitis
Специально для CyberForum - консольная утилита для переименования файлов с использованием регулярных выражений. Предистория
С некоторых пор перестал меня устравать скрипт на VBS для переименования файлов. https://www.cyberforum.ru/post3932252.html
- Работает медлено. - Проблема с кодировками, особенно сохранение в UTF-8 (файлы отката) - Никогда нет уверенности, через cscript или wscript он выполнится (а запускать через них слишком длинно). - Объект Shell.Application.NameSpace, используемый для фильтрации файлов завязан на проводник и не всегда адекватно себя ведёт (то zip файлы папками считает, то вообще ничего не видит, то сортирует неизвестно как), а в последних версиях винды ситуация только ухудшилась. - На FAT и FAT32 (флешки) отсутствует сортировка - и т.д. Поэтому скрипт был переписан на PureBasic, при этом добавлены возможности другого скрипта для перенумерации файлов. Как ни странно, существенного увеличения скорости достичь не удалось (~2 раза, правда, это если не обрабатывать описания, с описаниями выигрыш скорость существенно выше). Регулярные выражения достаточно тяжёлые и забирают, похоже, основную массу времени. Краткое описание
Как и скрипт vrenn, программа изменяет только имена файлов, расширения не затрагиваются. Для папок считается, что у них расширений нет. Имена вида ".qwerty", т.е. начинающиеся с единственной точки, считаются состоящими из одного имени без расширения.
Назначение программы отражено её названии: XRENN = X - Регулярные выражения REN - RENAME / RENUMBER N - Names only Работа с регулярными выражениями построена на базе библиотеки PCRE, в версии входящей в состав библиотеки PureBasic и допиленой напильником ![]() Основные функции (кратко): * Переименование. XRENN [mask] pattern replace|\ [/] [/PF:text] [/SF:text] * Перенумерация. XRENN [[mask] pattern] /N[:start] [/A:width] [/STEP:step] [/I:index|/] * Выравнивание чисел. XRENN [[mask] pattern] /A:width [/I:index|/] * Копирование (/C) или перемещение (/M) XRENN [mask] pattern /C:folder|/M:folder * Удаление (/D) или удаление в корзину (/DR) XRENN [mask] pattern /D|/DR * Откат переименования XRENN /U:undofile * Откат последнего переименования для текущей папки XRENN /UL Общие ключи /mask - Альтернативный способ задать маску. Маска должна содержать хотя бы один символ * или ?. /L:filelist - файл, содержащий список обрабатываемых файлов. /Q - Не выводить результаты работы и сообщения на экран, пауза в конце не делается. /Q1 - Все результаты, ошибки и статистика выводится на экран. Пауза в конце не делается. /Q2 - Выводится только статистика. Пауза не делается. /VBS - Для работы с регулярными выражениями используется VBScript.RegExp /VBSX - Для работы с регулярными выражениями используется VBScript.RegExp, обратные ссылки задаются в виде \1, \2 и т.д. /CS - Case Sensitive - Учитывать регистр в регулярном выражении. /H - Обрабатывать скрытые и системные файлы. /Z- - Не обрабатывать описания. /Z+ - Обрабатывать описания. /U- - Не создавать файл отката. /U+ - Создавать файл отката. /UCD - Создавать скрытый файл отката в текущей папке. Кода возврата 0 - Нет ошибок 1 - Ошибка в параметрах. 2 - Ошибка в регулярном выражении. 3 - Ошибка открытия файла списка или файла отката. 4 - Ошибка изменения папки. 5 - Ошибка переименования. 6 - Ошибка обработки файла описаний. 7 - Ошибки отката. Синонимы ключей: /C - /COPY, /M - /MOVE, /DR - /RECYCLE, /D - /DELETE, /N - /RENUM, /A - /ALIGN, /I - /INDDEX, /U - /UNDO, /UL - /UNDOLAST, /U+ - /UNDO+, /U- - /UNDO-, /UCD - /UNDOCD, /SF - /SUFFIX, /PF - /PREFIX, /L - /LIST, /T - /TEST. В синонимах разделительные знаки ":" и "=" опускать нельзя. Программа развивается, добавляются новые возможности, правятся ошибки. Принимаются багрепорты и предложения по развитию. В планах:
- Обратная сортировка.
- Сортировка без учёта расширений. - Not Global - Преобразование регистра в заменяемой строке. Более подробное описание в прилагаемом файле.
0
|
|
13.07.2014, 00:27 | |
Ответы с готовыми решениями:
24
Поиск с использованием регулярных выражений
|
![]() ![]() |
|
13.07.2014, 00:35 [ТС] | 2 |
Спасибо, что поделились проектом.
Хотелось бы видеть в архиве отдельной папкой хотя бы один пример: несколько файлов и батник с полным примером вызова. Мое ИМХО, для человека, который ни разу не пользовался утилитой, вот такое описание (под спойлером) самое идеальное. Но это мое личное мнение. Из описания: /Z- - Не обрабатывать описания. /Z+ - Обрабатывать описания. /U- - Не создавать файл отката. /U+ - Создавать файл отката. Хотелось бы дописку в скобках "(по-умолчанию)" для пунктам, которые такими являются. Тогда об этом должно быть оговорено сразу же под названием утилиты, как основной функционал.
0
|
1744 / 349 / 41
Регистрация: 15.10.2012
Сообщений: 548
|
|
13.07.2014, 10:21 | 3 |
Описание буду подправлять.
Примеры, конечно, надо добавить, подумаю. Копирование, перемещение и удаление я считаю, всё-таки, второстепенными функциями. Копирование и переименование были добавлены в скрипт vrenn исключительно по принципу "чтобы былО", поэтому, когда переносил функционал в программу, оставил их (хотя некоторое время колебался), ну и до кучи добавил удаление (до удалени в скрипте руки тогда не дошли). Про опускание знаков ":" и "=" - это пришло из другого скрипта для перенумерации, можно написать "xrenn /n:001 /i:2" или можно записать "xrenn /n001 /i2", но в "длинной" форме только так "xrenn /renum:001 /index:2"
0
|
![]() ![]() |
|
13.07.2014, 15:09 [ТС] | 4 |
Очень даже хороший функционал.
Я вообще за, если это будет сразу бросаться в глаза. XRENN /U:undofile - для одного файла. XRENN /UL - для всей папки. Между слов, какие функции в FAR-е подвязываешь к descript.ion ?
0
|
1744 / 349 / 41
Регистрация: 15.10.2012
Сообщений: 548
|
|
13.07.2014, 16:43 | 5 |
Менять имя не хочу. Может что-то типа
Допустим, выполняются три переименования подряд, в результате чего создаются файлы 2014-07-13--09-52-50--00000000000184267554.xrenn 2014-07-13--09-53-18--00000000000184295291.xrenn 2014-07-13--09-53-24--00000000000184301047.xrenn Надо выполнить откат. Можно выполнить XRENN /U:2014-07-13--09-53-24--00000000000184301047.xrenn А можно выполнить XRENN /UNDOLAST В обоих случаях файл будет переименован в 2014-07-13--09-53-24--00000000000184301047.xrenn-bak Если продолжать откат, выполнить либо XRENN /U:2014-07-13--09-53-18--00000000000184295291.xrenn Либо опять просто XRENN /UNDOLAST Файл будет переименован в 2014-07-13--09-53-18--00000000000184295291.xrenn-bak и следующей командой /UNDOLAST можно выполнить следующий откат. Но /UNDOLAST работает только для текущей папки - из всех файлов *.xrenn ищется последний, содержащий строчку "@CHDIR /D путь" на текущую папку. Это сделано специально, чтобы случайно не выполнить UNDOLAST неизвестно куда. Собственно, у меня всегда в окне ФАРа всегда открыт хотя бы узкий, но столбец, показывающий описание. Есть макрос DESCSS, работающий аналогично QuickSearch для быстрого поиска по описаниям. Навскидку использование описаний: - Коментарии к пректу (например, на одном предпрятии есть папка проекта C4115, менять её не желательно, делаю её коментарий Robot-A) - Ссылки на сайты (форумы) скачанного файла или другой коментарий (серийник ![]() - Дату, когда не желательно менять имя файла. - Размер большого файла при скачивании wget-от в отдельном окне, чтобы отследить, всё ли скачалось. и т.п.
1
|
1744 / 349 / 41
Регистрация: 15.10.2012
Сообщений: 548
|
|
19.07.2014, 18:18 | 6 |
Ключи /Z+ и /U+ (/UNDO+) будут удалены, как, по сути, ничего не делающие. Вообще, я думал, добавить файл с настройками по умолчанию (xrenn.ini) или переменную среды (xrenncmd) с ключами по умолчанию или то и другое. Но теперь не хочу - нафига тут ещё какие-то файлы конфигурации? Тогда необходимость в этих ключах отпадает.
Такой вот вопрос возник. Исправлял проверку параметров - какой параметр (без /) чему соответствует. Как то запутано получается - первый параметр может быть маской, а может быть шаблоном. Эта путаница ещё в vrenn была, где когда чем считать. Может ну его нафиг? Маску всегда задавать как ключ /*.txt и она должна иметь хотя бы один символ * или ? (а иначе это и не маска). Таким образом первый параметр всегда шаблон, второй всегда замена. Так будет однозначно.
0
|
1744 / 349 / 41
Регистрация: 15.10.2012
Сообщений: 548
|
|
19.07.2014, 21:52 | 8 |
Тогда уж надо /patern/replace/modifiers, но не хочется ещё и синтаксическим разбором регулярного выражения заниматься. Спасает, конечно, то что символ / в именах файлов недопустим, а нам регэксп для имён файлов и нужен. Когда-то такая идея уже была. Вот только некрасиво всё это смотрится, если в выражении встречаются пробелы и всё это надо ещё и в кавычки заключать. А чтобы без кавычек - это свой парсер командной строки делать и сразу конфликты с ключами возникают.
Добавлено через 26 минут К сожалению, общепринятый символ задания ключей под Виндой "/" совпадает с общепринятым символом-ограничителем для регулярных выражений.
0
|
![]() ![]() |
||||||
19.07.2014, 23:08 [ТС] | 9 | |||||
Заключение аргументов, в составе которых есть спецсимволы или знак пробела - в кавычки - это общепринятый стиль вызова консольных программ в командной строке.
Думаю, здесь ничего нового выдумывать не нужно. Все превосходно разбирается с помощью функции CommandLineToArgvW. Если что и парсеры уже придуманы. На счет полного синтаксиса, вот и получится:
0
|
1744 / 349 / 41
Регистрация: 15.10.2012
Сообщений: 548
|
|
20.07.2014, 13:12 | 10 |
Плохо. Как, например, отличить ключ /cs от строки замены?
Идеально было бы /patern/replace/, но если будут пробелы, то всё это надо заключать в кавычки "/pat ern/rep lace/" и уже не так смотрится. Вот тут бы и понадобился свой парсер - есть символ начала выражения "/", есть в середине, в конце, но опять гадские пробелы всё портят и если вдруг будет что-то типа /n2 /a3 / непонятно, что это, ключи или регулярное выражение. Переходить на ключи "с минуса" -N2 тоже не дело. В общем, не вижу пока нормального решения - так, чтобы и вводить поменьше и выглядело читабельно и неоднозначностей не возникало...
0
|
Модератор
![]() 4952 / 2006 / 387
Регистрация: 06.01.2013
Сообщений: 4,698
|
|
20.07.2014, 14:26 | 11 |
Smitis, как вариант, как в cscript начинать ключи с "//". Например, "//A".
Также, фиксировать положение паттерна и реплейса КОНЦОМ строки. Тогда одиночный символ / будет означать конец ключей и начало регэкспов.
0
|
1744 / 349 / 41
Регистрация: 15.10.2012
Сообщений: 548
|
||||||
23.07.2014, 22:29 | 13 | |||||
Имхо, то что для WSH ключи начинаются с // не несёт никакой смысловой нагрузки. Разве только визуальная возможность выделять их из общей командной строки. Непонятно, зачем так сделали.
Я стараюсь придерживаться некой концепции использования параметров, о которой несколько слов. Эта концепция схожа с используемой в WSH, так как я использую и скрипты и программы, в общем, чтобы было похоже. Есть "позиционные" параметры, unnamed в терминологии wsh, т.е. смысл параметра зависит от его положения относительно других позиционных параметров. В дальнейшем - это просто "параметры". Есть "ключи", начинающиеся с /, в терминологии wsh - named. Имеют вид /ключ или /ключ:значение. В дальнейшем - просто ключи. Ключи могут располагаться где угодно, в том числе и между/перед позиционными параметрами. Конфликты между ключами обрабатываются просто - обрабатываем ключи слева на право, в случае конфликта приоритет имеет обработанный последним. Ключи игнорируются, если они не имеют смысла в определённом контексте (например, при удалении ключи /F и /FF смысла не имеют, всё равно удаляются только файлы). Вот с позиционными параметрами я и хочу навести порядок. А то что означает первый параметр?
Может быть не достаточно аргументированно, но не нравится, и всё тут (аргумент, однако! ![]() Для регулярных выражений можно сделать синтаксис pattern/replace, с приоритетом меньшим, чем двумя отдельными параметрами. П.С. Нарисовался конфликт параметров. Пустой ключ / означает символ ^ в начале регулярного выражения (сопоставлять с началом строки). Было сделано для сокращения записи, так как в командной строке символ ^ имеет значение esc-символа, и для его использования надо заключать строку в кавычки, даже если нет дугих причин это делать (строку без пробелов). Но пустой параметр используется и при перенумерации, где означает обработку первого числа в имени. Пренумерация пришла из другой программы (скрипта на vbs) где регулярных выражений не было. А здесь есть... В общем, исправлю, будет означать только ^.
0
|
1744 / 349 / 41
Регистрация: 15.10.2012
Сообщений: 548
|
|
27.07.2014, 21:08 | 14 |
v.5.01.04
- Удалены ключи /Z+ /U+ /UNDO+ - Более строгая проверка правильности параметров. В случае конфликта параметров, программа заканчивает выполнение с выдачей хелпа. - При /PF или /SF, если нет замены, можно не задавать и шаблон. Тогда шаблон принимается "." (по сути - все файлы). - Исправлено: В списке, заданом ключём /L сначала обрабатываются папки, затем файлы (раньше было общим списком, в результате часть имени папки после точки рассматривалась как расширение, что могло привести не к тому результату, который ожидался). - Исправлено: Ключ / теперь только шаблон с начала строки. - Исправлено: Ошибка переименования обработанного xrenn-файла командой /U:file (не запоминался путь к файлу). - В файле отката chdir заменена на pushd. - В файл отката в коментарий записываются параметры запуска xrenn. - В файл отката, в случае ошибки переименования, помещается строка :ERROR name1 name2 (это было и ранее, но не было описано). Файл описания пока не правил. С масками поведение пока не ломал, посмотрим.
1
|
1744 / 349 / 41
Регистрация: 15.10.2012
Сообщений: 548
|
|
24.08.2014, 23:17 | 15 |
v.5.02.00
- Новый PureBasic 5.30 (это сразу добавило пару десятков килобайт к программе ![]() - Исправлена ошибка удаления в корзину. - Исправлена ошибка выравнивания чисел. - Более строгая проверка значений параметров и конфликтов параметров. - Добавлена возможность задавать маску исключаемых файлов - задаётся вместе с обычной маской и отделяется от неё символом "\". Например: 123*.*;234*.*\*.doc;*.txt или \*.jpg (в последнем случае маска не задана, только исключение). - При перенумерации файлы сортируются по числовому значению в имени, заданному ключом /I или по умолчанию, а не по алфавиту, как раньше. - /PF и /SF теперь отдельные операции, а не как опции при операции замены. - Добавлена возможность вставки номера в имя файла: если имя после переименования или добавления суффикса/префикса содержит последователность символов \N, она будет будет заменена на очередной номер. Нумерация задаётся ключами /NN (аналог /N - начальное значение), /NA (аналог /A - выравнивание) и /STEP. По умолчанию нумерация начинается с 1 с шагом 1. Если ключ /NA не задан, для выравнивания будет взята длина значения из ключа /NN с учётом всех цифр. - Если перед номером в ключе /N (/RENUM) стоит знак "+" или "-" вместо перенумерации выполняется изменение номеров на заданное значение. Т.е., в каждом файле к числу заданному /I будет прибавлено значение параметра. - Программа теперь автоматически расчитывает ширину поля для выравнивания чисел, т.е. делается предположительный анализ результата и числа выравниваются до длины самого большого числа. Автоматический расчёт ширины не производится если: -- В ключах /N и /NN число имеет слева незначащие нули - для выравнивания будет использована длина этого числа без знака с учётом всех незначащих нулей (т.е. взято количество всех цифр). -- Используются ключи /A и /NA. - В случае ошибок в параметрах, теперь выводится не общий help, а выводится список параметров с первого до ошибочного. Под вопросом пока остаётся изменение чисел - оставить как сейчас, т.е. /N:1 это перенумерация с 1, а /N:+1 - это прибавить ко всем числам 1. Или сделать отдельным ключом, типа /ADD:1
1
|
1744 / 349 / 41
Регистрация: 15.10.2012
Сообщений: 548
|
||||||
14.09.2014, 01:53 | 16 | |||||
v.5.03.00
- Исправлена ошибка обработки имён файлов в кавычках в списках и файлах отката - не правильно обрабатывались имена, начинающиеся с пробела. - Исправлено выравнивание при вставке \N. - При /A и /NA без значения или со значением равному 0, выравнивание будет происходить по файлу с числом максимальной длины. Для отключения выравнивания можно использовать /A:1 и /NA:1 - Переписан парсер командной строки. Стандартный парсер PureBasic не совсем хорошо обрабатывает параметры с необрамляющими весь параметр кавычками. Например параметр типа /p:" a s d f " WSH воспримет так же, как "/p: a s d f ", т.е., такие пары кавычек воспринимаются как часть параметра. Более сложный случай: "a s d f "zzz" 1 2 3 4" равнозначен "a s d f zzz 1 2 3 4". Парсер же PureBasic такие параметры разбивал на несколько. Единственное отличие от WSH теперь то, что новый парсер слитные параметры типа /d/f/g воспринимает раздельно, а WSH как один параметр. Скрипт проверки параметров для WSH на VBS
1
|
1744 / 349 / 41
Регистрация: 15.10.2012
Сообщений: 548
|
|
17.09.2014, 16:37 | 17 |
1
|
251 / 163 / 14
Регистрация: 10.03.2012
Сообщений: 544
|
|
20.09.2014, 19:15 | 18 |
Smitis, ну я бы не сказал, что моё поделие является полноценным конкурентом вашей тулзы. У вас функционал обширнее и более профессионален. У меня же ориентация больше на простых юзверей. И потом, вряд ли я её буду дальше развивать. Sad but true.
Кстати, моя утилитка тоже на пурике.)
0
|
1744 / 349 / 41
Регистрация: 15.10.2012
Сообщений: 548
|
|
27.09.2014, 21:36 | 19 |
v.5.04.00
- Восстановлено случайно потерявшееся исправление: Изменена обработка списка в ключе /L - папки и файлы обрабатываются раздельно. - Добавлено: Ключ /UCD при выполнении /UNDO - не выполнять переход в папку (CHDIR и PUSHD), файлы обрабатывать в текущей папке (нужен для отката, когда путь к папке поменялся или папка была переименованна). - Добавлено: При /UNDOLAST больше не выполняется переход в папку (CHDIR и PUSHD) в файлах отката, найденых в текущей папке (причина та же, что и для предыдущего изменения). - Добавлено: Ключ /EXT - учитывать при переименовании расширения. Для особо тяжёлых случаев... - Если файл не имеет описания, а для нового имени описание есть (по сути, ошибка в файле описаний), описание не удаляется, т.е. переименованный файл получит то потерянное описание. - Файл отката теперь создаётся всегда, даже если не было переименованно ни одного файла. Раньше в этом случае он не создавался, а это приводит к неопределённости при последовательном откате нескольких переименований.
1
|
1744 / 349 / 41
Регистрация: 15.10.2012
Сообщений: 548
|
|
27.09.2014, 21:38 | 20 |
П.С.
Есть задумка написать более продвинутый аналог FORFILES...
0
|
27.09.2014, 21:38 | |
Помогаю со студенческими работами здесь
20
Парсинг файла с использованием регулярных выражений Валидация формы c использованием регулярных выражений Проверка формы с использованием регулярных выражений Выявление url с использованием регулярных выражений Переделать программу с использованием регулярных выражений Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |