Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Массовое переименование, отнимая слова от текущего имени (http://forum.oszone.net/showthread.php?t=335775)

ArchyA 18-07-2018 17:31 2822428

Массовое переименование, отнимая слова от текущего имени
 
Доброго всем!

Пожалуйста, подскажите, как сделать переименование файлов по шаблону:
Есть папки с файлами, и в них файлы.
dirName1
  • slovo-dirName1-[RandomName].jpg
  • slovo-dirName1-[RandomName].jpg
  • slovo-dirName1-[RandomName].jpg
dirName2
  • slovo-dirName2-[RandomName].jpg
  • slovo-dirName2-[RandomName].jpg
  • slovo-dirName2-[RandomName].jpg
Нужно сохранить структуру папок, но из файлов убрать мусор — slovo (оно всегда известно) и dirName*, оставив только [RandomName].jpg
То есть отнять какое-то количество заранее известных слов, разделенных дефисом.
Проблема в том, что просто по дефису делать нельзя — и в слове, и в имени папки, и в нужном имени тоже могут быть дефисы, надо как-то именно отнимать два слова...

Это был результат выполнения скрипта (перемещал, а не переименовывал потому, что в некоторых папках по ren происходило зацикливание и рост длинны имени файлов до бесконечности),
а теперь надо переименовать обратно:
Код:

for /d %%d in ("*") do (
cd %%d
for %%f in ("*.jpg") do move /y %%f ..\slovo-%%d-%%f
cd ..
move /y *.jpg .\%%d\
)

Буду очень признателен за подсказку...

mwz 18-07-2018 17:36 2822431

ArchyA, упростим задачу:

Т.е. вам надо отрезать последовательность от начала имени и по второй дефис включительно, типа убрать
slovo-dirName1-
чтобы не заморачиваться тем, что dirname все разные? Или в именах каталогов тоже могут быть дефисы?

ArchyA 18-07-2018 17:37 2822432

Дефисы могут быть внутри и слова, и папки, и имени... поэтому и пишу )
Например, slo-vo-dir-super-name-nujnoe-imya-faila.jpg,
при этом slo-vo и dir-super-name будут известны.

И кол-во дефисов везде произвольное :(:(:(

ArchyA 18-07-2018 17:52 2822443

Точнее так, в слове дефисов нет нигде и оно везде одинаковое.
А в каждой папке и в каждом имени могут быть или не быть 1-3 дефиса.
И внутри каждой папки слово и второе слово, имя папки, всегда фиксированное для всех файлов в этой папке

mwz 18-07-2018 17:54 2822445

ArchyA, это хуже.

Тогда вопрос: файлы сейчас разложены по папкам тем же, что и dirName, входящее в состав имён и которое надо отрезать?
Если нет — ещё хуже. Особенно если файл в папке один.

PS
Чисто на будущее: применяйте в таких случаях сочетания, которые могут встретиться в именах лишь с очень малой вероятностью. Например, #####slovo-dirName1-###### и даже slovo-dirName1-######- вместо slovo-dirName1- вообще никаких затруднений не вызвало бы.

ArchyA 18-07-2018 17:59 2822446

Файлов в папке НИКОГДА не будет меньше трёх.
Да, ВСЕ файлы начинаются со слова+имя_текущей_папки.

вот живой пример:

E:\screens\elk\birthday
..
symbol-birthday-birthday.jpg
symbol-birthday-blue.jpg
symbol-birthday-green.jpg
symbol-birthday-martini.jpg
symbol-birthday-red.jpg
symbol-birthday-rose.jpg

mwz 18-07-2018 18:42 2822456

Цитата:

Цитата ArchyA
Файлов в папке НИКОГДА не будет меньше трёх »

Поскольку "ВСЕ файлы начинаются со слова+имя_текущей_папки- — это уже не принципиально, и задача имеет нормальное решение.

Теперь ясно всё — но я уж колхозить не буду: тут спецы должны предложить гораздо более изящное решение, чем наваял бы я. :sorry:

Ну а вариант — вычислять в каждой папке количество символов в последовательности slovo-имя_папки- и переименовывать все файлы этой папки, используя их текущее имя начиная с символа, следующего за вычисленным значением. И затем переходить к следующей папке

megaloman 18-07-2018 19:45 2822475

Наколхозю
Код:

@Echo Off

Set "BoxIn=Z:\Жил-был у бабушки"
Set "Mask=В начале было слово*.jpg"

For /f "usebackq delims=" %%i in (`2^>nul dir /b /s /a:-d "%BoxIn%\%Mask%"`) Do Set "Fpath=%%~dpi" &Call :OverRen "%%i" "%%Fpath:~0,-1%%"
GoTo :Eof

:OverRen
        Set "NewName=%~nx1"
        Call Set "NewName=%%NewName:*%~nx2-=%%"

        echo Ren %1 "%NewName%"
GoTo :Eof

Для боевой работы уберите echo перед Ren
Мои файлы (если я правильно понял задачу)

До переименования

Z:\Жил-был у бабушки\В начале было слово-Жил-был у бабушки-серенький волк.jpg
Z:\Жил-был у бабушки\В начале было слово-Жил-был у бабушки-страшный козел.jpg
Z:\Жил-был у бабушки\В начале было слово-Жил-был у бабушки-три-весёлых-гуся.jpg
Z:\Жил-был у бабушки\Бабушка козлика\В начале было слово-Бабушка козлика-серенький волк.jpg
Z:\Жил-был у бабушки\Бабушка козлика\В начале было слово-Бабушка козлика-страшный козел.jpg
Z:\Жил-был у бабушки\Бабушка козлика\В начале было слово-Бабушка козлика-три-весёлых-гуся.jpg
Z:\Жил-был у бабушки\Бабушка козлика\Очень любила\В начале было слово-Очень любила-серенький волк.jpg
Z:\Жил-был у бабушки\Бабушка козлика\Очень любила\В начале было слово-Очень любила-страшный козел.jpg
Z:\Жил-был у бабушки\Бабушка козлика\Очень любила\В начале было слово-Очень любила-три-весёлых-гуся.jpg
Z:\Жил-был у бабушки\Серенький козлик\В начале было слово-Серенький козлик-серенький волк.jpg
Z:\Жил-был у бабушки\Серенький козлик\В начале было слово-Серенький козлик-страшный козел.jpg
Z:\Жил-был у бабушки\Серенький козлик\В начале было слово-Серенький козлик-три-весёлых-гуся.jpg

После переименования

Z:\Жил-был у бабушки\серенький волк.jpg
Z:\Жил-был у бабушки\страшный козел.jpg
Z:\Жил-был у бабушки\три-весёлых-гуся.jpg
Z:\Жил-был у бабушки\Бабушка козлика\серенький волк.jpg
Z:\Жил-был у бабушки\Бабушка козлика\страшный козел.jpg
Z:\Жил-был у бабушки\Бабушка козлика\три-весёлых-гуся.jpg
Z:\Жил-был у бабушки\Бабушка козлика\Очень любила\серенький волк.jpg
Z:\Жил-был у бабушки\Бабушка козлика\Очень любила\страшный козел.jpg
Z:\Жил-был у бабушки\Бабушка козлика\Очень любила\три-весёлых-гуся.jpg
Z:\Жил-был у бабушки\Серенький козлик\серенький волк.jpg
Z:\Жил-был у бабушки\Серенький козлик\страшный козел.jpg
Z:\Жил-был у бабушки\Серенький козлик\три-весёлых-гуся.jpg


ArchyA 19-07-2018 18:59 2822683

Это оно :) Идеально, спасибо! В понедельник оттестирую и отпишусь.

Работает великолепно, именно то, что нужно, спасибо огромное! )


Время: 13:06.

Время: 13:06.
© OSzone.net 2001-