Компьютерный форум 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=286926)

Alexander_88 23-08-2014 21:17 2393193

Переименование указанного количества файлов следуя нумерации
 
Здравствуйте. Есть ли способ переименовать заданное количество файлов в указанной папке, продолжая нумерацию и названия файлов, присутствующих в папке?
К примеру в папке 30 файлов, 10 файлов вида 0001start.avi, 0002start.wmv, 0003start.avi - 0010start.mpg, остальные 20 имеют различные названия. Я задал количество 20 файлов. Можно ли сделать так, чтобы код переименовывал файлы имеющие различные названия, продолжая нумерацию и повторяя название имеющимся, т.е. в данном примере 20 файлов должны переименоваться на 0011start.*, 0012start.*, 0013start.* - 0030start.*. Известно, что нумерация всегда четырехзначная, слова после нумерации в одной папке всегда одинаковы (но они могут быть не только "start"), расширения могут быть различные (видео файлы) Нумерация может быть не с еденицы, к примеру с 0546stop.* 0547stop.* :o

Iska 23-08-2014 22:21 2393228

Alexander_88, в общем и целом — можно. Дьявол, как обычно, кроется в деталях.

К чему я это? Дело в том, что подобного рода переименования, если только они не производятся планово, регулярно и на постоянной основе, проще и удобнее всего делать «ручками» в любом приличном файловом менеджере или специально на то предназначенном приложении. Например:


У Вас как с этим?

Georgio 23-08-2014 22:31 2393231

Здравствуйте. Alexander_88.


Код:

@echo off
chcp 1251>nul

set "folder=D:\Work\118\указанная папка"

set "reg_exp=^[0-9][0-9][0-9][0-9]start\...*"
for /f "delims=" %%i in ('
 dir /a-d/b/o-n "%folder%\*start.*"^| findstr /ir "%reg_exp%"
') do (
 set max=%%i
 goto:#
 )

:#
set count=1%max:~,4%
for /f "delims=" %%i in ('
 dir /a-d/b "%folder%"^| findstr /irv "%reg_exp%"
') do (
 set /a count+=1
 call ren "%folder%\%%i" "%%count:~1%%start%%~xi"
 )

exit /b


Alexander_88 23-08-2014 22:34 2393234

Iska, да, я это делаю в тотал командоре, просто необходимо заходить в него, заходить в папки, их штук 10, и в каждой выделять файлы , писать маски. А если бы был такой код чтоб отслеживал нумерацию и проолжал после самой большой, значительно бы можно было сэкономить время, даже текст можно было самому в коде ручками прописать, а нумерация чтоб как то продолжалась, с таким кодом создать несколько бат файлов (на разные папки) и разместить их на рабочий стол, если потребуется продолжить нумерацию файлов в какой то папке, запустил бат со стола и готово :)

Alexander_88 23-08-2014 23:03 2393240

Georgio, спасибо, отлично работает, а можно ли задать число файлов для переименования?

Georgio 24-08-2014 09:22 2393297

Цитата:

Цитата Alexander_88
а можно ли задать число файлов для переименования? »


Код:

@echo off
chcp 1251>nul

set number=20
set "folder=D:\Work\121\указанная папка"

set "reg_exp=^[0-9][0-9][0-9][0-9]start\...*"
for /f "delims=" %%i in ('
 dir /a-d/b/o-n "%folder%\*start.*"^| findstr /ir "%reg_exp%"
') do (
 set max=%%i
 goto:#
 )

:#
set count=1%max:~,4%
for /f "delims=" %%i in ('
 dir /a-d/b "%folder%"^| findstr /irv "%reg_exp%"
') do (
 set /a count_2+=1
 for /f %%j in ('
  set /a count_2
 ') do (
  if %%j leq %number% (
  set /a count+=1
  call ren "%folder%\%%i" "%%count:~1%%start%%~xi"
  ) else (
  exit /b
  )
  )
 )

exit /b


Alexander_88 24-08-2014 09:35 2393300

Georgio, спасибо, проверил, все работает :)

Alexander_88 05-03-2016 15:37 2613121

Здравствуйте, подскажите пожалуйста, что нужно изменить в последнем коде, если у меня теперь у файлов нумерация пишется в конце...
т.е. start0001.avi, start0002.avi, start0003.avi и т.д.

я строчку:

Код:

set "reg_exp=^[0-9][0-9][0-9][0-9]start\...*"
изменил на:

Код:

set "reg_exp=^start[0-9][0-9][0-9][0-9]\...*"
Но к сожалению это не помогло :(

Georgio 05-03-2016 16:03 2613125

Ещё замените
Код:

dir /a-d/b/o-n "%folder%\*start.*"^| findstr /ir "%reg_exp%"
на
Код:

dir /a-d/b/o-n "%folder%\start*.*"^| findstr /ir "%reg_exp%"
и
Код:

  call ren "%folder%\%%i" "%%count:~1%%start%%~xi"
на
Код:

  call ren "%folder%\%%i" "start%%count:~1%%%%~xi"
.

Alexander_88 05-03-2016 18:23 2613147

Спасибо за ответ
вот в этом посте

http://forum.oszone.net/post-2512648-9.html

был заменен код немножко
Может из - за этого что - то другое заменить нужно? (я просто забыл, что код заменяли)
Я заменил код, как вы сказали.

Сейчас у меня вот так:

Код:

@echo off
chcp 1251>nul

set number=20
set "folder=i:\папка"

set "reg_exp=^start[0-9][0-9][0-9][0-9]\...*"
for /f "delims=" %%? in ('
 dir /a-d/b/o-n "%folder%\start*.*"^| findstr /ir "%reg_exp%"
') do (
 set max=%%?
 goto:#
 )

:#
set count=1%max:~,4%
for /f "delims=" %%? in ('
 dir /a-d/b "%folder%"^| findstr /irv "%reg_exp%"
') do (
 set /a count_2+=1
 for /f %%* in ('
  set /a count_2
 ') do (
  if %%* leq %number% (
  set /a count+=1
  call ren "%folder%\%%?" "start%%count:~1%%%%~x?"
  ) else (
  exit /b
  )
  )
 )
exit /b

Вроде файлы переименовываются, но не в то, что нужно, несколько надписей в окне (ошибок) о том, что файл с таким именем уже существует.
переименовались несколько файлов на start с разным расширением, а так же на имена имена start1 start2 ...

slav13 17-11-2017 21:00 2778284

Здравствуйте.
Помогите! Есть ли в вашей практике вариант bat файла для запуска в директории с файлами, которые надо пронумеровать.
Добавить номер перед именем файла (не меняя его), например: 001 имя.txt (здесь пробел между номером и именем файла) и т.д. до 150,
не зависимо от количества фалов в директории. Нумеруются строго 150 файлов. Если их < 150, заканчивает работу.
Если их >150, нумерует 150 и заканчивает работу. Если в числе нумеруемых файлов попадаются файлы уже пронумерованные,
то их номера заменяются на текущие.
Спасибо!

slav13 17-11-2017 22:03 2778297

Georgio
Здравствуйте.
Помогите! Есть ли в вашей практике вариант bat файла для запуска в директории с файлами, которые надо пронумеровать.
Добавить номер перед именем файла (не меняя его), например: 001 имя.txt (здесь пробел между номером и именем файла) и т.д. до 150,
не зависимо от количества фалов в директории. Нумеруются строго 150 файлов. Если их < 150, заканчивает работу.
Если их >150, нумерует 150 и заканчивает работу. Если в числе нумеруемых файлов попадаются файлы уже пронумерованные,
то их номера заменяются на текущие.
Спасибо!

Alexander_88 07-07-2019 05:33 2878530

Здравствуйте.. опять потревожила эта задача с наименованиями типа start0001, start0002 (цифры в конце). Может есть, кто в курсе темы?
Делаю так (пытаюсь хотя бы файл переименовать):

Код:

@echo off
chcp 1251>nul

set number=1
set "folder=G:\03 start"

set "reg_exp=^start[0-9][0-9][0-9][0-9]\...*"
for /f "delims=" %%? in ('
 dir /a-d/b/o-n "%folder%\start*.*"^| findstr /ir "%reg_exp%"
') do (
 set max=%%?
 goto:#
 )

:#
set count=1%max:~,4%
for /f "delims=" %%? in ('
 dir /a-d/b "%folder%"^| findstr /irv "%reg_exp%"
') do (
 set /a count_2+=1
 for /f %%* in ('
  set /a count_2
 ') do (
  if %%* leq %number% (
  set /a count+=1
  call ren "%folder%\%%?" "start%%count:~1%%%%~x?"
  ) else (
  exit /b
  )
  )
 )
exit /b

файл переименовывается в start.. но цифры в конце не добавляются(( Может кто - то знает, что еще исправить, чтобы заработало?

Alexander_88 07-07-2019 11:04 2878546

Если для BAT это не корректно, может есть решение для PowerShell (поменял, на "Любой язык").

megaloman 07-07-2019 11:20 2878548

Alexander_88, Вот вариант
Код:

@Echo Off
cls
>nul Chcp 1251
 
        Set "BoxIn=Z:\Soft_In"
        Set "Kword=start"
        Set "Reg=^%Kword%[0-9][0-9][0-9][0-9]\..*"
        Set /A M=4

        Set "Mask=*.*"
        Set /A Max=25       
       
        Set /A Num=1000000
        Set /A MMax=%Max%+%Num%
        FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Kword%*.*" /B /O:N /A:-D ^|findstr /I /R /C:"%Reg%"`) DO (
                Call :RenNNN "%BoxIn%" "%%a" "%Kword%" %M% %MMax% ||Exit /B 1
        )

        Set /A Num=1000000
        Set /A MMax=%Max%+%Num%
        FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /O:N /A:-D`) DO (
                Call :RenNNN "%BoxIn%" "%%a" "%Kword%" %M% %MMax% ||Exit /B 1
        )
Pause
Exit /B

:RenNNN
        Set /A Num+=1
        If %Num% GTR %5 Exit /B 1
        Call Set "NNum=%%Num:~-%4%%"
        2>nul Ren "%~1\%~2" "%~3%NNum%%~x2" ||GoTo :RenNNN
Exit /B 0

Как это организовано:
В первом For просматриваем файлы startNNNN.* и перенумеровываем их вподряд start0001, start0002 ...
Во втором For переименовываем все остальные файлы по указанной маске в start c последующими номерами
Если этого не нужно, этот for надо или заремить, или убрать

Есть возможность ограничить число переименований файлов (Set /A Max=25)
Если этого не надо, можно задать заведомо большое число, или заремить If %Num% GTR %5 Exit /B 1
То же для NNNNstart.*
Код:

@Echo Off
cls
>nul Chcp 1251
 
        Set "BoxIn=Z:\Soft_In"
        Set "Kword=start"
        Set "Reg=^[0-9][0-9][0-9][0-9]%Kword%\..*"
        Set /A M=4

        Set "Mask=*.*"
        Set /A Max=25       
       
        Set /A Num=1000000
        Set /A MMax=%Max%+%Num%
        FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Kword%*.*" /B /A:-D ^|findstr /I /R /C:"%Reg%"`) DO (
                Call :RenNNN "%BoxIn%" "%%a" "%Kword%" %M% %MMax% ||Exit /B 1
        )

        Set /A Num=1000000
        Set /A MMax=%Max%+%Num%
        FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D`) DO (
                Call :RenNNN "%BoxIn%" "%%a" "%Kword%" %M% %MMax% ||Exit /B 1
        )
Pause
Exit /B

:RenNNN
        Set /A Num+=1
        If %Num% GTR %5 Exit /B 1
        Call Set "NNum=%%Num:~-%4%%"
        2>nul Ren "%~1\%~2" "%NNum%%~3%~x2" ||GoTo :RenNNN
Exit /B 0


Alexander_88 07-07-2019 12:50 2878561

Спасибо, попробовал убрать, первый for, потом второй.
Но в обоих случаях переименовываются сами файлы start. Видимо нужно было конкретнее написать.. Скрипт не должен их трогать, переименовывать нужно только другие файлы (все, кроме start****). Необходимо продолжить нумерацию вперед, не принимая во внимание предыдущую нумерацию. Т.е. найти самый последний номер (самый большой) и продолжить от него нумерацию.

например было:
Код:

00uyjkskh.wmv
start0056.mp4
start0057.avi
start0058.wmw
ljsfdhgsjkd.avi
ziyxvyz.mpg

Мы задаем количество - 2 файла для переименования (нужно обязательно указывать нужное количество, чтобы не переименовывалось все)

стало:
Код:

start0056.mp4
start0057.avi
start0058.wmw
start0059.wmv
start0060.avi
ziyxvyz.mpg

Переименовались:
00uyjkskh.wmv > start0059.wmv
ljsfdhgsjkd.avi > start0060.avi

Файлы start0056.mp4, start0057.avi, start0058.wmw остались неизменными.

Файлы, которые переименовываются, могут переименовываться в любой последовательности, не обязательно по алфавиту, главное, чтобы не переименовывались файлы start****, переименовываться должны все другие (точнее не все, а указанное мной количество.

megaloman 07-07-2019 13:59 2878574

Alexander_88, Предыдущий вариант переименовывает все файлы, нумерацию делает с 1. Сделано в условиях нечеткой постановки. Если надо продолжить нумерацию, и не обращать внимание, есть ли там прорехи, и переименовать нужное кол-во файлов, вот вариант:
Код:

@Echo Off
cls
>nul Chcp 1251
 
        Set "BoxIn=Z:\Soft_In"
        Set "Kword=start"
        Set "Reg=^%Kword%[0-9][0-9][0-9][0-9]\..*"
        Set /A M=4

        Set "Mask=*.*"
        Set /A Max=2

        Set /A NMax=0       
        FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Kword%*.*" /B /O:N /A:-D ^|findstr /I /R /C:"%Reg%"`) DO (
                Set "NMax=%%~na"
                Call Set "NMax=1%%NMax:~-%M%%%"
        )

        Set /A Num=1000000
        Set /A Num=%Num%+%NMax%
        Set /A MMax=%Max%+%Num%

        Set /A MMax=%Max%+%Num%
        FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /O:N /A:-D ^|findstr /I /R /V /C:"%Reg%"`) DO (
                Call :RenNNN "%BoxIn%" "%%a" "%Kword%" %M% %MMax% ||Exit /B 1
        )
Pause
Exit /B

:RenNNN
        Set /A Num+=1
        If %Num% GTR %5 Exit /B 1
        Call Set "NNum=%%Num:~-%4%%"
        2>nul Ren "%~1\%~2" "%~3%NNum%%~x2" ||GoTo :RenNNN
Exit /B 0

Первый For ищет максимальный номер, во втором - переименовываются остальные файлы (заданное количество)

Alexander_88 07-07-2019 17:16 2878622

Спасибо, все работает, а количество задавать только здесь?
Код:

Set /A Max=2
больше нигде не надо?

megaloman 07-07-2019 17:22 2878623

Alexander_88, я стремлюсь, чтобы все исходные данные были в одном месте, так что, только здесь и один раз.

Alexander_88 08-07-2019 05:56 2878717

а не подскажете вариант (на всякий случай) для NNNNstart ?

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

Код:

@Echo Off
cls
>nul Chcp 1251
 
        Set "BoxIn=F:\01 start"
        Set "Kword=start"
        Set "Reg=^[0-9][0-9][0-9][0-9]%Kword%\..*"
        Set /A M=4

        Set "Mask=*.*"
        Set /A Max=1

        Set /A NMax=0       
        FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\*%Kword%.*" /B /A:-D ^|findstr /I /R /C:"%Reg%"`) DO (
                Set "NMax=%%~na"
                Call Set "NMax=1%%NMax:~-%M%%%"
        )

        Set /A Num=1000000
        Set /A Num=%Num%+%NMax%
        Set /A MMax=%Max%+%Num%

        Set /A MMax=%Max%+%Num%
        FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D ^|findstr /I /R /V /C:"%Reg%"`) DO (
                Call :RenNNN "%BoxIn%" "%%a" "%Kword%" %M% %MMax% ||Exit /B 1
        )
Pause
Exit /B

:RenNNN
        Set /A Num+=1
        If %Num% GTR %5 Exit /B 1
        Call Set "NNum=%%Num:~-%4%%"
        2>nul Ren "%~1\%~2" "%NNum%%~3%~x2" ||GoTo :RenNNN
Exit /B 0


megaloman 08-07-2019 11:10 2878741

Alexander_88,
вариант (на всякий случай) для NNNNstart
Код:

@Echo Off
cls
>nul Chcp 1251
 
        Set "BoxIn=Z:\Soft_In"
        Set "Kword=start"
rem        Set "Reg=^%Kword%[0-9][0-9][0-9][0-9]\..*"
        Set "Reg=^[0-9][0-9][0-9][0-9]%Kword%\..*"
        Set /A M=4

        Set "Mask=*.*"
        Set /A Max=2

        Set /A NMax=0       
rem        FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Kword%*.*" /B /O:N /A:-D ^|findstr /I /R /C:"%Reg%"`) DO (
        FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\*%Kword%.*" /B /O:N /A:-D ^|findstr /I /R /C:"%Reg%"`) DO (
                Set "NMax=%%~na"
rem                Call Set "NMax=1%%NMax:~-%M%%%"
                Call Set "NMax=1%%NMax:~0,%M%%%"
        )

        Set /A Num=1000000
        Set /A Num=%Num%+%NMax%
        Set /A MMax=%Max%+%Num%

        Set /A MMax=%Max%+%Num%
        FOR /F "usebackq delims=" %%a IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /O:N /A:-D ^|findstr /I /R /V /C:"%Reg%"`) DO (
                Call :RenNNN "%BoxIn%" "%%a" "%Kword%" %M% %MMax% ||Exit /B 1
        )
Pause
Exit /B

:RenNNN
        Set /A Num+=1
        If %Num% GTR %5 Exit /B 1
        Call Set "NNum=%%Num:~-%4%%"
rem        2>nul Ren "%~1\%~2" "%~3%NNum%%~x2" ||GoTo :RenNNN
        2>nul Ren "%~1\%~2" "%NNum%%~3%~x2" ||GoTo :RenNNN
Exit /B 0


Alexander_88 10-07-2019 01:18 2879085

Спасибо, удалил красные строки, теперь все работает для NNNNstart :)


Время: 11:00.

Время: 11:00.
© OSzone.net 2001-