Войти

Показать полную графическую версию : [решено] Переименование файлов в каталоге (.avi)


dokxpi@vk
07-05-2015, 12:43
Доброго времени суток

Нужно все файлы с расширением .avi
привести/переименовать
в следующий вид:
2008-03-07_13.avi
2010-06-28_01.avi
и т. д.
Где 2008-03-07 - <год>.<дата>.<месяц>
создания файлов (когда было снято)
_01 - нумерация файлов в текущий папке

По возможности: добавить рекурсию, но
чтобы в каждом вложенном каталоге,
нумерация файлов начиналась с _01 а не
продолжался общий счет

Заранее благодарен

megaloman
07-05-2015, 18:27
@Echo Off

Set "Where=D:\Media"
Set "Mask=*.avi"

Set /A Count=1000
FOR /F "usebackq delims=" %%f IN (`Dir "%Where%\%Mask%" /b /A:-D /O:D /T:W 2^>nul`) DO Call :Recount "%Where%\%%f" "%Where%"

FOR /F "usebackq delims=" %%d IN (`Dir "%Where%\" /b /s /A:D 2^>nul`) DO (
Set /A Count=1000
FOR /F "usebackq delims=" %%f IN (`Dir "%%d\%Mask%" /b /A:-D /O:D /T:W 2^>nul`) DO Call :Recount "%%d\%%f" "%%d"
)
GoTo :Eof

:Recount
Set /A Count=%Count%+1

Set "DC=%~t1"
Set "DC=%DC:~6,4%-%DC:~3,2%-%DC:~0,2%"

ren %1 "%DC%_%Count:~-2%%~x1"
У Вас мутноватая постановка: 2010-06-28 никак не может быть <год>.<дата>.<месяц>, не понятно, что такое нумерация файла в папке: по какому принципу они отсортированы?
Вы уверены, что в папке не более 99 файлов?
В приведенном батнике файлы отсортированы по дате последнего изменения, соответственно ведётся и нумерация.

dokxpi@vk
07-05-2015, 18:42
megaloman, что-то не так, даже не запускается

dokxpi@vk
07-05-2015, 19:00
<год>.<дата>.<месяц>
Сорри.. <год>.<месяц>.<дата>
Вы уверены, что в папке не более 99 файлов? »
Меньше
не понятно, что такое нумерация файла в папке »
Я просто хотел сказать, что если папка новая, то считать нужно начинать с 1

будьте любезны озаботиться чтобы батник был в 866 кодировке (ДОС)/ Проверьте, маска файла правильная? Set "Mask=*.avi" »
С этим всё в порядке, изначально маску изменил на .avi и сохранил в 866 кодировке...

dokxpi@vk
07-05-2015, 19:16
Нечего не происходит, с файлами точно
https://yadi.sk/d/cRkOqGkBgVMDJ (окно запуска)

@Echo Off

Set "Where=D:\Media"
Set "Mask=*.avi"

rem FOR /F "usebackq delims=" %%d IN (`Dir "%Where%\" /b /s /A:D`) DO (

FOR /F "usebackq delims=" %%d IN (`Dir /b /s /A:D`) DO (

echo %%d

Set /A Count=1000
FOR /F "usebackq delims=" %%f IN (`Dir "%%d\%Mask%" /b /A:-D /O:D /T:W 2^>nul`) DO Call :Recount "%%d\%%f" "%%d"
)
GoTo :Eof

:Recount
Set /A Count=%Count%+1

Set "DC=%~t1"
Set "DC=%DC:~6,4%-%DC:~3,2%-%DC:~0,2%"

rem ren %1 "%DC%_%Count:~-2%%~x1"


echo ren %1 "%DC%_%Count:~-2%%~x1"

megaloman
07-05-2015, 19:37
@Echo Off
cls

Set "Where=D:\Media"
Set "Mask=*.avi"

Echo ========= Begin bat =============
pause

Set /A Count=1000
FOR /F "usebackq delims=" %%f IN (`Dir "%Where%\%Mask%" /b /A:-D /O:D /T:W 2^>nul`) DO Call :Recount "%Where%\%%f" "%Where%"

pause

FOR /F "usebackq delims=" %%d IN (`Dir "%Where%\" /b /s /A:D 2^>nul`) DO (
Set /A Count=1000
FOR /F "usebackq delims=" %%f IN (`Dir "%%d\%Mask%" /b /A:-D /O:D /T:W 2^>nul`) DO Call :Recount "%%d\%%f" "%%d"
pause
)
GoTo :Eof

:Recount
Set /A Count=%Count%+1

Set "DC=%~t1"
Set "DC=%DC:~6,4%-%DC:~3,2%-%DC:~0,2%"

echo ren %1 "%DC%_%Count:~-2%%~x1"


Попробуйте этот вариант. Что батник выдаёт на экран? Или ничего не выдаёт?
Исправил неточность в первоначальном коде вверху. Код рабочий. Что вверху, что вот этот отладочный (но отладочный реально не переименовывает, так как стоит эхо
echo ren %1 "%DC%_%Count:~-2%%~x1"

??????????????? :cool:

dokxpi@vk
08-05-2015, 01:35
echo ren %1 "%DC%_%Count:~-2%%~x1" »
https://yadi.sk/i/Ltf8y4zugViaZ
Исправил неточность в первоначальном коде вверху. Код рабочий.
Забрал (https://gist.github.com/dokxpi/a875e0e0262be6e5fe75)
Спасибо, вам большое!

dokxpi@vk
08-05-2015, 02:06
Всё гуд,
единственное — обходит папки, в которых, внутри имени присутствует нестандартные символы,
пример такой папки: "media ♫"

dokxpi@vk
08-05-2015, 03:14
Пакетный файл положить в корневую папку и запустить. »
Никаких эмоций, не работает

megaloman, вот только сейчас заметил: файлы переименовывает по дате изменения, а нужно по дате съёмки
https://yadi.sk/i/HkyGmPIDgVneK

Iska
08-05-2015, 03:20
megaloman, вот только сейчас заметил: файлы переименовывает по дате изменения, а нужно по дате съёмки »
Старайтесь изначально:
Где 2008-03-07 - <год>.<дата>.<месяц>
создания файлов (когда было снято) »
точно формулировать задачу.

Вкупе с:
обходит папки, в которых, внутри имени присутствует нестандартные символы,
пример такой папки: "media ♫" »
полагаю, что лучше будет пользовать PowerShell.

Georgio
08-05-2015, 03:34
Код PowerShell: gci '*.avi' -Recurse|%{rni $_ ((Get-Date ($x=(New-Object -ComObject Shell.Application).NameSpace(($y=$_.DirectoryName))).GetDetailsOf($x.ParseName($_.Name),12) -Format 'yyyy-MM-dd')+'_'+$(if($y -ne $z){$i=1};($i++).ToString().PadLeft(2,'0');$z=$y)+'.avi')}.

Iska
08-05-2015, 06:32
.GetDetailsOf($x.ParseName($_.Name),12) »
Там не зависит от версии ОС?

Georgio
08-05-2015, 13:18
Там не зависит от версии ОС? »


Понятия не имею. Я бы действительно рекомендовал устанавливать это число экспериментально, например, для русифицированных версий ОС код PowerShell для этого действия должен выглядеть примерно так: 1..40|%{if((New-Object -ComObject Shell.Application).NameSpace((gi Env:SystemDrive).Value).GetDetailsOf('',$_) -eq 'Дата съемки'){$_;break}} (мой вариант).

Кстати, если даже установить это число наверняка, то далеко не факт, что этот пункт будет иметь непустое значение, поэтому в таком случае надо использовать дату создания, а для этого нужно "разветвлять" код.

У меня большое предчувствие, что ТС считает возможным переименовывать файлы по дате съёмки с помощью "чистого" пакетного файла. Если бы речь шла просто о дате создания, то можно было бы попробовать написать код пакетного файла (нечто подобное я уже где-то писал), но не знаю, стоит ли игра свеч.

dokxpi@vk
08-05-2015, 19:43
точно формулировать задачу. »
Iska, а вы что-то другое процитировали? я же первоначально уточнил
создания файлов (когда было снято)
---------------------------
обходит папки, в которых, внутри имени присутствует нестандартные символы,
пример такой папки: "media ♫"

Чёрт с ним ...!
Главное поправить
megaloman, вот только сейчас заметил: файлы переименовывает по дате изменения, а нужно по дате съёмки »
---------------------------
У меня большое предчувствие, что ТС считает возможным переименовывать файлы по дате съёмки с помощью "чистого" пакетного файла. »
Есть такое, так я и полагал

Iska
09-05-2015, 00:14
я же первоначально уточнил »
создания файлов (когда было снято)
Это Вы только сейчас жирным шрифтом уточнили. А слова «создания файлов» трактуются достаточно однозначно.

Есть такое, так я и полагал »
Это никак не выйдет. Разве что какими-нибудь сторонними утилитами типа ReNamer (http://www.den4b.com/?x=products&product=renamer). Там есть и мета-тэги: ReNamer:Meta Tags - den4b Wiki (http://www.den4b.com/wiki/ReNamer:Meta_Tags) (но даты съёмки/записи avi там нет), и возрастающая нумерация: ReNamer:Rules:Serialize - den4b Wiki (http://www.den4b.com/wiki/ReNamer:Rules:Serialize). Кстати сказать, и в свойствах файла Проводника Windows эта информация из *.avi у меня также не отображается (под Windows 7 в данный момент).

dokxpi@vk
21-05-2015, 00:44
Это никак не выйдет. Разве что какими-нибудь сторонними утилитами типа ReNamer.
Нашёл
Total Commander ->Групповое переименование -> shelldetails ( wdx) -> [=shelldetails.Дата создания мультимедиа.D-M-Y]#0[C]




© OSzone.net 2001-2012