Невинный пост в группе ВК о сочетании клавиш проводника Ctrl + Shift + N внезапно зацепил приверженцев альтернативных файловых менеджеров. По ходу дела всплыла тема массового переименования файлов.
Евгений Генеральчик подметил, что в отличие от Total Commander, проводнику не по зубам переименование 20 тысяч файлов, например, добавление к имени файла текущей даты. Действительно, в классической серии пенальти я сам признал незаменимым сочетание Ctrl + M в TC, сфокусировавшись на функции поиска/замены.
Однако, отвечая Евгению в ВК, я заметил, что его задачу переименования решу в PowerShell и даже ванлайнером. Написал и подумал – надо все-таки решить, а то вдруг попросят пруфов :)
[+] Сегодня в программе
Переименование файлов методом «поиск / замена»
Через несколько минут у меня получился такой вариант:
Get-ChildItem -Path $env:userprofile\Downloads -Filter "*.zip*" -Recurse |` Rename-Item -NewName {$_.Name -Replace "\.zip$", "-$(Get-Date -Format {yyyy-MM-dd}).zip"} -WhatIf
На самом деле в команде одна строка, а на две я ее разбил, чтобы она лучше читалась. Давайте разберем составляющие команды.
Выборка файлов
Для получения списка файлов я использую командлет Get-ChildItem. Он же gci, он же ls, он же Элла Кацнельбоген dir, а эта команда прекрасно знакома всем, кто написал хоть один батник.
- -Path $env:userprofile\Downloads – файлы ищутся по заданному пути, т.е. в папке Downloads в профиле пользователя
- -Filter "*.zip" – фильтруются только файлы с расширением ZIP. Впрочем, в выборку попадут также и файлы, содержащие в имени ".zip", но этим я пренебрегу. В принципе, можно не указывать параметр, а просто написать .zip.
- -Recurse – поиск ведется рекурсивно, т.е. во всех вложенных папках. Кстати, в PowerShell 5.0, т.е. в Windows 10, у gci появился новый параметр -Depth, задающий глубину рекурсии. Например, 0 – только текущая папка, 2 – на два уровня вглубь.
Выбранные файлы по конвейеру передаются дальше для переименования.
Переименование файлов
Командлет Rename-Item тоже обладает хорошо известным псевдонимом ren. С помощью параметра -NewName задается новое имя, а в фигурных скобках стоит выражение, задающее условия переименования
- $_.Name – для каждого переданного по конвейеру файла $_ изменяется полное имя .Name
- -Replace "\.zip$", "-дата.zip" – я слегка упростил конструкцию, написав дату словом, чтобы был понятен смысл аргументов оператора -Replace: ‘что ищем’, ‘на что меняем’. Здесь тонкость в том, что у -Replace первый аргумент — регулярное выражение, а не просто поиск текста. В регулярных выражениях точка означает любой символ, поэтому использование ".zip" чревато нежелательным переименованием, например, файла winzip-setup.exe.
- "-$(Get-Date -Format {yyyy-MM-dd}).zip" – подставляем мы все-таки текущую дату в формате 2015-09-04. Формат дат я уже разбирал, а здесь хочу обратить ваше внимание на другой фокус. Выражение (в данном случае – командлет) не получится вставить просто так в аргумент оператора, но его можно поместить между круглыми скобками такой конструкции $().
- -WhatIf – этот стандартный параметр в переводе означает «что будет, если». Когда он добавлен в команду, ее реального выполнения не происходит, а в консоль выводится результат того, что могло бы произойти без этого параметра. Другими словами, вы можете проверить команду у себя, не опасаясь, что все архивы переименуются :)
Переименование файлов путем добавления счетчика
По ходу обсуждения в ВК выяснилось, что пример с датой надуманный, а более реальной выглядит последовательная нумерация файлов. Действительно, в TC я часто использовал очень удобный счетчик [C] для переименования графических файлов.
В PowerShell его тоже можно реализовать. Допустим, надо добавить счетчик из трех цифр в конце имени всех файлов JPG в текущей папке. Команда может быть такой:
dir *.jpg | % {$i=1} {ren $_ -NewName ("$($_.Basename)-{0:00#}.jpg" -f $i++) -WhatIf}
С выборкой все понятно, поэтому давайте разберем переименование.
- % — псевдоним командлета Foreach-Object, который перебирает по одному все переданные по конвейеру объекты. За ним следуют два блока скриптов в фигурных скобках { }, о которых чуть ниже.
- {$i=1} – первый блок, в котором переменная i получает значение 1. Это нужно для счетчика, который после переименования каждого объекта будет увеличиваться на единицу с помощью $i++.
- ren $_ — начало второго блока для переименования каждого полученного по конвейеру объекта.
- "$($_.Basename)-{0:0#}.png" – новое имя файла. Конструкцию $() я разбирал выше, но здесь я использую свойство Basename, т.е. имя файла без расширения (Name – имя файла с расширением).
{0:00#} – счетчик, причем в данном случае он трехзначный, что определяется конструкцией из трех символов 00# после двоеточия. Эквивалентом будет {0:D3}, где число после D задает количество символов счетчика.
Примечание о блоках скриптов
Существует три типа блоков:
- Begin (начало) — выполняется один раз в самом начале, до перебора элементов
- Process (обработка) — выполняется для каждого элемента
- End (конец) — выполняется в самом конце перебора
Командлет Foreach-Object обрабатывает блоки особым образом. Если ему указать только один блок, он воспринимает его как Process. Если два, то первый будет Begin, а второй — Process (наш случай). Если все три, то поведение стандартное: Begin → Process → End.
Дискуссия
Я не ставил перед собой задачу описать на языке PowerShell эквиваленты всех функций массового переименования Total Commander. Думаю, что это вполне возможно, а степень успеха зависит лишь от вашего уровня владения PowerShell, .NET и гуглояндексом. Вопрос лишь в том, насколько это целесообразно.
Графический интерфейс TC понятнее, нагляднее и не требует специальной подготовки. Однако бывают ситуации, когда вы не сможете воспользоваться любимым инструментом. Например, его нет в системе, а установить нельзя, поскольку ПК изолирован от внешней среды или это запрещено политикой организации. Если вы не ленитесь расширять свой кругозор и не упускаете случая поковырять PowerShell, вы с честью выйдете из такой ситуации.
Кстати, в ближайших записях я познакомлю вас с некоторыми новыми возможностями платформы PowerShell 5.0, включенной в Windows 10.
Расскажите в комментариях, какую задачу вы в последний раз решали:
- с помощью PowerShell или другого скриптового языка
- средства для массового переименования в любимом файловом менеджере
Я благодарю Василия Гусева за ценные дополнения, которые я добавил в статью после публикации.
Павел Нагаев
Вадим, в строке
знак «`» не обязательно ставить, т.к. PowerShell после | будет искать продолжение строки.
Vadim Sterkin
Паша, спасибо, я учту.
Vadimio Vadim
В последний раз решал задачу посылки любого sms сообщения через usb gsm «свисток». Причем скрипт работает как в оконном режиме(PowerGUI помог), так и в консольном.
Alexiz Kadev
Завидую (по хорошему) Вашей памяти, Вадим. Мне вот никак не удается весь этот «язык пляшущих человечков» запоминить. Это я относительно Вашей фразы про то, как PoSH может помочь в случае если Total поставить нельзя. Мне в этом случае поможет либо многочасовое чтение манов либо (если вдруг на таком ПК окажется инет) гугление.
Vadim Sterkin
Алекс, вы же ИТ-специалист? Тогда базовым английским владеете, а суть командлетов понятна из названия. Я их намного лучше понимаю, чем синтаксис команды FOR из CMD, который я так и не осилил, и без знания которого такие задачи не решаются.
Да, в этом случае Get-ChildItem не слишком очевиден, но это потому, что он не только к папкам применим, а еще и к реестру (gci hkcu:), хранилищу сертификатов и т.п. Но я в записи подчеркиваю псевдонимы dir, ren — не сложнее, чем в CMD :)
Lecron
А нет ли способов уменьшить нагрузку на память, для уже решенных задач?
Простых и быстрых. Записать эту команду в функцию и вызывать BulkRename *.jpg {name}{ddmmyy}.{ext} или BulkRename *.jpg {name}{cnt2/1}.{ext}, где «2» — количество знаков в нумерации, а «1» начальное значение счетчика.
Vadim Sterkin
Можно и функцию написать, было бы желание (у меня его нет :)
Billy Kid
Кто-нибудь объяснит, зачем переименовывать 20000 файлов? Такое бывает вообще? Приведите примеры.
А сколько файлов можно переименовать в проводнике? Хотя опять напрашивается вопрос — Зачем. Разве в Проводнике недостаточно инструментов для управления файлами?
Vadim Sterkin
Ок, пусть 20 файлов — как решать будете обе задачи в проводнике?
Billy Kid
Да в легкую. Даже не заморачиваясь ни на чем создал 40 файлов
https://cloud.mail.ru/public/3Zbq/uzYUwJjnz
И переименовал и задал теги.
А Тотал командер может работать с тегами в этом ракурсе?
Vadim Sterkin
Мда… Ладно, проехали.
Andrey Uvarov
Оно то переименовало, только что вы с такими похабными именами делать будете?
Живой пример, надо загрузить галерею фоток к статье на новостной сайт.
Заливать как DSCN0005.JPG и т.п. не вариант, так как редактор потом никогда не разберется какие фотки откуда. Принято правило именовать фотки как имя_статьи-00N.JPG, все латиницей и без пробелов. Как это сделать проводником?
Скриптом без проблем, хотя мы используем Bulk Rename.
Billy Kid
А вот еще пример
https://cloud.mail.ru/public/4bbb/vdWnPN2yr
Вообще не понимаю, в чем здесь увидели проблему. В проводнике все удобно работает. Никакие тоталы и фары не нужны. Никакие скрипты не нужны. Никакие языки не нужны.
Или задача состоит в том, кто изощренней будет изголяться? Пусть те, кто тыркается с тоталом, лучше поучится работать с Проводником. Либо у них действительно, прямая дорога назад в дос.
Vadim Sterkin
Ваши примеры того, что вы не читали статью, больше не нужны, спасибо.
strafer
Ладно, статью вы не поняли, давайте тогда про другое: а если надо будет в какой-то тег каждого файла записать его номер, который присутствует в имени этого же файла, вы это сможете сделать проводником для 640 файлов?
Александр [Маздайщик]
Последнее из того, что могу вспомнить — сортировка файлов, извлечённых по сигнатурам из образа диска с убитой файловой системой. Была написана программа (на C++), которая посекторно сканирует файл образа диска (дамп, полученный программой dd, которая есть и для Windows) и при обнаружении известной сигнатуры начинает выписывать новый файл. Имена полученных файлов в большинстве случаев имеют вид: «XXXX YYYYYYY.rar», где XXXX — порядковый номер файла, YYYYYY — номер сектора, с которого файл начинается на диске.
Для сортировки файлов были написаны адские батники, которые могли:
— Устранять копии. В первой версии файлы сравнивались каждый с каждым при помощи утилиты fc /b (fc умеет устанавливать errorlevel), но этот алгоритм имеет квадратичную сложность (время O(N²)), поэтому для больших наборов он уже не подходил. Стал перемещать файлы в каталог с именем из хеш-кода (вычисленного утилитой fciv.exe). Затем другой скрипт обходил подпапки и сохранял только самый первый файл из каждой из них (остальные удалял).
— Добавлять примерную дату создания к имени каждого архива. Архив извлекался во временную папку с восстановлением точного времени всех временных штампов (winrar x -ts arc.rar temp\), циклом for /r перебирались все файлы и выбиралась самая поздняя дата модификации.
— Сортировать архивы по содержимому. Утилитой rar.exe извлекался листинг каждого архива, команда find определяла наличие ключевого слова (она тоже устанавливает errorlevel в зависимости от результата), при успешном обнаружении архив перемещался в соответствующую подпапку.
О существовании средства массового переименования файлов в Far Manager’е я ничего не знаю, возможно есть соответствующие плагины, искать не пробовал.
В некоторых простых случаях для массового переименования/копирования файлов в Far я сначала создавал список файлов в новом текстовом файле:
dir /b *.abc > rename.bat
Затем правил rename.bat встроенным редактором, как правило, записывая макрокоманду. Потом нажимал горячую клавишу макрокоманды (как правило, Ctrl+Alt+↓) для каждой строчки в файле.
Либо просто записывал макрокоманду, которая в командной строке Far’а формирует команду переименования файла под курсором, тут же её выполняет (нажимает Enter) и переходит к следующему файлу (нажимает ↓). И опять давил на горячую клавишу десяток-другой раз.
.
Возвращаясь к cmd.exe. Мне кажется, я слишком хорошо знаю обычную командную строку, чтобы заставить себя начать изучать PowerShell. Нумерация файлов в текущем каталоге:
Добавление текущей даты будет отличаться использованием %DATE% вместо %SUF:~-3% в процедуре RENAME. Недостаток по сравнению с однострочником PowerShell — нужно создавать файл. И я тоже не помню наизусть все ключи команд set и for, но их всегда можно посмотреть командами set /? и for /?.
Под Линуксом ту же задачу я бы выполнил однострочником:
На Perl было бы короче, но Perl я не знаю, а awk знаю хорошо.
Vadim Sterkin
А я — нет. Мне взрывают мозг конструкции вида
И я не могу себя заставить выучить FOR, чтобы свободно лепить такое.
Угу, только вывод %DATE% отформатировать нужно, и в PowerShell это делается на порядок проще в плане понимания происходящего.
strafer
Более универсальный вариант на awk’е под любое расширение
если имя файла может содержать несколько частей, разделённых точками:
если уверены, что точка будет только перед расширением:
ЗЫ. Кстати сказать, вы в строке формата sprintf забыли указать размер поля вывода под число, будет 1, 2, … вместо нужного 001, 002, …
Lecron
Кстати, размер поля вывода указанный вручную, не намного меньший недостаток, чем его отсутствие. Зачем 3 знака для единиц файлов и что будет если файлов окажется больше 999?
strafer
Перед тем, как выполнять задание, надо его уяснить. В условиях задачи недвусмысленно сказано
Я не слишком силён в финтах питона, ваш код ниже это условие учитывает?
Говоря безотносительно к задаче в статье, в общем случае ничего не мешает сперва посчитать количество файлов, например
, а потом принять решение о выходном формате имён файлов.
Конкретно в случае awk’а он будет шлёпать числа дальше, т.е. 1000, 1001, …
Lecron
Просто я рассматривал задачу не как практикум по программированию, а как решение практической задачи. И если не изменяет память, wc -l выведет количество файлов, а не размер поля. Тогда уж
А в целом, считаю использование таких однострочников неэффективным. Это касается и PowerShell, и других шелов.
Для редкого использования, нужно ОЧЕНЬ хорошо знать командный синтаксис. А для регулярного, с поднятием из истории, попросту небезопасно. Так как нужно считывать/интерпретировать весь текст кода, найти и ввести параметры в разных его местах. Причем заранее произвести некоторые действия, например узнать количество файлов для переименования. Малейшая невнимательность, автоматизм действий и здрасьте проблемы.
И в первом, и во втором случае, лучше использовать скрипты/программы, с понятной системой ключей.
Мой скрипт тоже не учитывает. Но там параметры по крайней мере задаются в одном месте, в самом начале. При желании, можно написать
Тоже не бог весть как красиво, но для скрипта это уже не важно.
strafer
Практическая задача — добавить трёхзначный номер в имя файла.
Совершенно верно, но если лень глазами посчитать количество разрядов в выведенном числе — посчитайте их wc -m, ради бога :-) (только не стоит забывать, что он ещё и символ перевода строки засчитает и выдаст на один разряд больше, чем реально есть в числе)
Знать надо не хуже, чем нужно знать какой-либо ЯП, например питон, для программирования на нём. Если такие задачи приходится решать в консоли часто, то синтаксис запоминается довольно быстро. К тому же, в случае регулярных выражений, они следуют практически одной логике, нужно только помнить о мелких различиях в конкретной реализации. Т.е. понимая их в принципе, можно ваять и в sed, и в grep, и в awk.
Если «регулярно» — это раз в год, то не вижу смысла писать отдельный скрипт для такой задачи, отлично сгодится поднимать из истории этот. Если раз в неделю — то конечно стоит написать, и кстати не факт, что bash-скрипт будет хуже питоновского (по крайней мере интерпретировать его можно будет вероятно на любом линуксе в мире, кроме самых кастрированных).
Возможно вы не обратили внимания, я себе соломку подстелил: если удалить непосредственно исполняющую задачу команду (в данном случае mv), то xarg просто выведет аргументы без какого-либо изменения на диске. Хорошо как для отладки, так и для уверенности в том, что однострочник двухгодичной давности делает именно то, в чём ты его подозреваешь :)
ЗЫ. Если что, чтоб не было недопонимания, я скриптов не против, я сам их понаписал уже порядочно. Но однострочники вполне православны для мелких поручений.
Lecron
Все так. Я не предлагаю язык, я именно про скрипт.
Хочу еще добавить, что задача редко остается неизменной. Наоборот, обычно расширяется. А в скриптах проще добавлять новый функционал и рефакторить код.
Даже обсуждаемый однострочник лучше будет выглядеть как
massRename *.jpg —counter -l3 (или -lauto)
strafer
Вы, видимо, программистом работаете, ну или в порядке крепкого хобби кодите, я угадал? В таком случае вы, видимо, просто психологически чувствуете себя лучше, когда код в файле, и стремитесь к этому в любом случае :-)
Я больше админю и поэтому не упираю на это. Либо сразу в начале решения, либо по ходу использования становится понятно, что скрипт нужен будет часто. В таком случае я его превращаю в собственно скрипт в файле и облагораживаю параметрами и проверками.
А если нечасто или вообще больше никогда — так я про него и не вспомню.
Это профанация, т.к. это не однострочник, а вызов скрипта, который ещё нужно написать самому. Суть однострочника — в использовании короткой комбинации относительно стандартных утилит.
Писать в отдельный файл однострочный код, который возможно никогда не понадобится — это совсем уж чересчур, ему самое место в файле истории шелла.
Lecron
Для пакетного переименования использую FAR с плугином NameEditor от Артёма Сеничева.
Считаю PS пригодным для системного скриптинга. Для прикладного, к которому относится и данная задача, предпочту использовать Python. Да, это не будет однострочником, но применимость языка настолько выше, что его все равно выгодно учить, а на известном языке написать что угодно уже не проблема. Вдобавок, по моему мнению, он начнет заметно выигрывать, в случае разрастания функционала.
Vadim Sterkin
Не считаю, что Python ориентирован на такие задачи больше, чем PowerShell. А так, в PS можно даже C# засунуть, если владеешь им.
Lecron
Возможно. Кто что больше знает, к тому и тянется. Просто мне несколько раз встречались задачи расширенного переименования, при которых кажется PS потеряет читабельность.
Автоматическое определение количество знаков в счетчике, по количеству файлов. 01..87 или 001..264.
Переименование, c автоматическим распределением по папкам 1..хх, чтобы в каждой было не более 200 файлов и чтобы имя файла также содержало имя папки.
Похоже, как с bat-никами. Для определенных задач, он идеален. Для простых. Но чуть задание усложняется, на борьбу с ограничениями, особенностями интерпретатора, синтаксисом уходит больше времени, чем на решение проблемы.
Вот еще пример, из недавнего применения скриптинга. Однопоточная программа. Обработка очереди файлов несколькими экземплярами программы, по количеству ядер процессора.
strafer
Сдаётся мне, что он тоже какой-то надуманный :)
По самому однострочнику: на мой взгляд более элегантно делать наиболее универсальные скрипты, в этом смысле стоило бы расширение сделать динамическим, тогда ему при изменении начальной команды можно кормить любые файлы, а не только жпеги.
Впрочем, если виндовая консоль всё ещё не умеет в историю команд, так наверное и пофигу.
По вопросам: пользуюсь часто, постоянно, по мелочи (и переименования — частая задача), однострочниками или пишу скрипты: grep, sed, awk, cut и прочие прелести к моим услугам :)
Vadim Sterkin
Придумал не я, но нумерацией в свое время пользовался, о чем и написал в статье.
Можно задавать расширение переменной, это не суть важно.
А что, в Линуксе есть история команд? Нет, правда? Не может быть…
strafer
Ну это моя личная заморочка, всегда стараюсь писать код так, чтобы его можно было с минимальными изменениями использовать многократно.
Вот тут сарказма не понял. Конечно она есть, и ещё какая.
ЗЫ. Спасибо, что добавили теги для кода в другом посте, совсем забыл.
Vadim Sterkin
↑↓
Get-History
Ctrl+R (PS 5.0+)
strafer
Спасибо, посмеялся.
Не надо умными словами кидаться, я же, когда вы спрашиваете, не посылаю вас курить маны, а объясняю сам.
Между сессиями история команд уже сохраняется и вызывается без бубна? Уже можно просто открыть окно терминала и вернуть команду, которую набирал десять лет назад?
Что это, инициация инкрементального поиска?
Vadim Sterkin
Следите за обновлениями блога…
strafer
А, я похоже залез вперёд. Что ж, с интересом почитаю.
artem
я просто оставлю это здесь
http://i.imgur.com/jnmMk9k.png
пример правда какой-то надуманный, но я понимаю, что это не ты. Я вот как-то решал такую задачу сходной упоротости. Есть много архивов Zip. Надо распаковать их всех каждый в свою папку. При этом через какое-то время могут появиться новые зипы, надо будет ещё раз запустить скрипт. При этом чтобы старые он распаковать уже не пытался. (Т.к. уже есть распакованные папки, ничего хорошего из этого не выйдет).
Поскольку мне смотреть на эти зипы вообще не интересно, особенно после того, как они уже распакованы, я придумал такую штуку. После распаковки файлу ставится атрибут «скрытый», а при поиске файлов для распаковки скрытые файлы игнорируются. Так я из в общем-то тривиальной задачи сделал заковыристую.
Vadim Sterkin
Артем, это хороший обходной путь, если нельзя переместить распакованный ZIP в подпапку.
artem
Можно, только зачем? Чтобы эта папка маячила перед глазами? Я вот думал о том, чтобы перемещать не в дочернюю, а в соседнюю папку, т.е. расположенную на одном уровне с текущей. Но это как раз было бы обходным путём, т.к. пришлось бы вводить в систему ещё и эту дополнительную папку. Так что скрытые файлы — это самый что ни на есть прямой и очевидный путь :)
Billy Kid
Не знаю о каком номере речь.
Остатся непонятным, для чего эта мышиная возня с кучей переименований и вставок чего-либо, куда-либо. Тег говорит о файле то что нужно. Зачем вписывать в него лишнюю информацию, типа порядкового номера? Может еще массу файла до кучи вписать? ))) Какие еще танцы с там-тамами предложите, которые наоборот запутывают работу, вместо того чтобы делать ее прозрачно?
strafer
О том, который на ваших скриншотах в скобочках.
Я про случай, когда тег о файле не говорит то, что нужно, и надо туда это нужное записать. Случаи бывают разные, возможно когда-то кому-то и масса потребуется. А файлов может быть стопицот и руками это всё неделю придётся конопатить.
Вот вам довольно реальная задача. Вы скачали полную дискографию вашего любимого исполнителя в формате, например, flac. Автор раздачи конечно молодец, что это всё собрал, сграбил и конвертнул, но вот в тегах он оказался не силён, поэтому всю информация об альбомах, годы выпуска, названия песен и их порядковый номер в альбоме и прочее он указал в именах файлов и каталогов. Если вы такое откроете в любом плеере, то искать нужную композицию будет мягко говоря проблематично (это к вопросу того, запутываю ли я работу или наоборот упрощаю), не говоря о том, что не будут работать рюшечки типа подгрузки обложек альбомов и текстов песен. Печально, но другой такой же раздачи вы не нашли.
Вам, как ярому поборнику толькогуя, остаётся два варианта — смириться с УГ или лопатить теги врукопашную. На минуточку, у некоторых плодовитых исполнителей может быть порядка тысяч композиций, так что при выборе второго варианта вас ждут незабываемые гекточасы однообразных операций.
Lecron
Есть форматы, которые теги не поддерживают. Есть устройтсва, которые теги не поддерживают, даже для «правильных» форматов или с ними неудобно работать. Поэтому возможность тегирования не исключает переименование.
sdfgsdfg asdfgfdg
А если нужно, вместо добавления к имени файла текущей даты, наоборот, убрать из имён файлов все даты или порядковые номера?
Vadim Sterkin
Нужно регулярное выражение, что-то типа вашего имени.
sdfgsdfg asdfgfdg
То есть, вы хотите сказать, что можете так же за пару минут, с помощью PowerShell, переименовать некое количество файлов убрав из них порядковые номера илт даты?
Vadim Sterkin
Я за пару минут не смогу, не силен в регулярных выражениях. Но гугл никто не отменял.
pongo
Для переименования файлов и папок использую программы ReNamer и Advanced Renamer. Плюс таких программ — все наглядно. Если нужно что-то по-сложнее, то напишу скрипт на питоне.
lesha
Пользуюсь для переименования Total Commander. Иначе зачем я покупал его )
^M действительно чудодейственная вещь. С плагином exif, можно любые метаданные вытащить из картинок.
С powershell у меня как-то не зашло, да и надобности не было, зато освоил autoit, особенно нравится его справка в chm
Vadim Sterkin
Нечасто услышишь, что нравится справка :)
BoOMSys
Не хочу быть занудой, но почему никто не вспомнил про встроенную утилиту «forfiles»? Которая мигрировала в windows 7/8/8.1 с сервера 2003
Vadim Sterkin
Чтобы не быть занудой, покажите команду, решающую хотя бы одну озвученную в статье задачу.
BoOMSys
https://www.outsidethebox.ms/11968/ один из ваших примеров.
К примеру выбор по расширению и переименовать в имя файла + текущая дата:
Команда
Результат: http://prntscr.com/8oikyx