Показать полную графическую версию : [решено] Пакетное переименование файлов (синхронизирование имён одного расширения с другим)
Имеется произвольный список файлов *.mkv
А также список допустим *.ac3
абв 1.mkv
абц2.mkv
...
test 1.ac3
test 34.ac3
...
Требуется 1-ый найденный ac3 переименовать, взяв имя из 1-ого найденного mkv, порядок сортировки обычный, соотвественно, должно стать:
test 1.ac3 ->абв 1.ac3
test 34.ac3->абц2.ac3
Дальше извлечения из mkv-файлов списка имен без расширения в txt-файл уйти мне не удалось:
For %%I In ("*.mkv") Do (echo %%~nI>>nameslist.txt)
Цикл, который пробежится по всем строчкам nameslist.txt я сделать могу
Цикл, который переименует каждый файл *.ac3 в какое-то конкретное имя, например, со счетчиком я тоже могу.
А не могу я совместить эти 2 цикла, чтобы для 1ого файла ac3 сопоставить 1ую строчку из nameslist.txt, для 2ого - 2ую строчку и т.д.
Вот тут (http://forum.oszone.net/thread-184481.html) похожая задача решалась, но более простая, т.к. исходное имя переименовываемого файла там конкретное, а не призвольное-полностью неизвестное как в моём случае.
Ivan Bardeen
04-03-2011, 08:43
Количество файлов *.mkv и *.ac3 одинаковое?
Они все лежат в одной папке?
Количество файлов *.mkv и *.ac3 одинаковое?
Они все лежат в одной папке? »
Да, в одной папке. Желательно учесть ситуацию при неодинаковом количестве файлов.
Ivan Bardeen
04-03-2011, 09:35
Желательно учесть ситуацию при неодинаковом количестве файлов. »
Как поступать в таком случае?
Как поступать в таком случае? »
Да я честно говоря не вижу тут каких-либо альтернатив, чтобы было из чего выбирать:
1-ой вариант (с условными именами):
a.mkv, b.mkv, c.mkv
1.ac3, 2.ac3
3-его ac3-файла нету, переименовывать нечего - как тут по другому можно поступить, кроме пропуска?
2-ой вариант:
a.mkv, b.mkv
1.ac3, 2.ac3, 3.ac3
Имя для переименования 3его ac3-файла взять неоткуда, т.к. нет mkv - также кроме как пропустить тут делать ведь нечего...
Ivan Bardeen
04-03-2011, 09:47
Требуется 1-ый найденный ac3 переименовать, взяв имя из 1-ого найденного mkv, »
И еще вопрос, 1-ый найденный - это, как я понимаю сортировка по алфавиту?
И еще вопрос, 1-ый найденный - это, как я понимаю сортировка по алфавиту? »
Да
Вроде бы поставленная задача средней сложности...неужели никто ничего не подскажет?
SendMessage
09-03-2011, 10:40
Видно после праздника голова не работает. Получилась такая ересь. :)
Но самое смешное - у меня работает. Если у Вас не будет - не удивлюсь.
@echo off
setlocal enabledelayedexpansion
set "SFileName=z:\sandbox\003\*.ac3"
set "DFileName=z:\sandbox\003\*.mkv"
set n=0
for /f "delims=" %%a in ('dir /a-d/b/oen "%SFileName%"') do (
set /a n+=1
set "arr=!arr!^ren "%%a" "^>!n!"/"
)
set n2=0
for /f "delims=" %%i in ('dir /a-d/b/oen "%DFileName%"') do (
set /a n2+=1
if !n2! LEQ n call set arr=%%arr:^>!n2!=%%~ni.ac3%%
)
set arr=%arr:/=^&%
2>nul (%arr:~,-1%)
SendMessage,
Отлично, спасибо! У меня вроде тоже работает (естественно, в начало командника добавил cd /D "%~dp0" и удалил из кода z:\sandbox\003\ чтобы полностью соответствовало поставленной задаче)
А не могли бы рассказать принцип действия? И особенно прокомментировать, что именно происходит в выделенных частях в этих строках:
set "arr=!arr!^ren "%%a" "^>!n!"/"
if !n2! LEQ n call set arr=%%arr:^>!n2!=%%~ni.ac3%%
set arr=%arr:/=^&%
2>nul (%arr:~,-1%)
SendMessage
09-03-2011, 11:35
А не могли бы рассказать принцип действия? »
Принцип действия простой - создается массив команд REN. Ну а они переименовывают.
Теперь то, что у Вас выделено красным:
^ren - символ ^ ставится, чтобы cmd не принял это за команду, а просто как текст.
"%%a" "^>!n!"/" - ну первая часть - просто путь файла с расширением ac3, вторая - идентификатор для будущих действий. Примерно так это выглядит в виде текста:
ren "a.ac3" ">1"/. После второго прохода цикла - ren "a.ac3" ">1"/ren "b.ac3" ">2"/ ну и т.д.
%%arr:^>!n2!=%%~ni.ac3%% - замена счетчика на имя файла с расширением mkv. Где-то так: %%arr:>1=имяMKVфайла.ac3%%
:/=^& - замена символа / на &.
2>nul (%arr:~,-1%) - ну а это, собственно само переименование. 2>nul - не выводить сообщения об ошибках. %arr:~,-1% - массив получившихся команд REN. Без последнего символа. Выглядит примерно так:
ren "a.ac3" "имя1.ac3"&ren "b.ac3" "имя2.ac3"&ren "c.ac3" "имя3.ac3"
El Sanchez
09-03-2011, 21:32
19w85, ересь №2 :), только покороче:
@Echo Off
Set Source=C:\Source
SetLocal
For /F "Tokens=1* Delims=:" %%A In ('Dir /B /A-D "%Source%\*.ac3"^|FindStr /N .') Do Set FN%%A=%%B
For /F "Tokens=1* Delims=:" %%A In ('Dir /B /A-D "%Source%\*.mkv"^|FindStr /N .') Do If Defined FN%%A Call Ren "%Source%\%%FN%%A%%" "%%~nB.ac3"
EndLocal
El Sanchez,
Покороче - это отлично, спасибо! По этому коду даже вопросов нет, всё проще и понятнее. (я как раз в своих попытках и пытался реализовать именно такой способ через 'Set FN%%A=%%B' только ошибок много наделал, теперь смог увидеть, где именно, ещё раз спасибо) :)
Имеется произвольный список файлов
Специально для подобных целей написал батник для пакетного переименования файлов по списку:
http://it.dnepro.org/2013/120.html
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.