3

I have a large folder of .cbr's, and I'm renaming them by issue number to correctly order them. What do I need to include in the ren line to have each file increment the number in the file name via windows command prompt? I'll be doing this frequently so I'll make this a .bat file.

For example, where n = initial number and m = final number: n.cbr, (n+1).cbr, ..., (m-1).cbr, m.cbr

The .bat thusfar:

ren *.cbz *.cbr
ren *.cbr <increment numbers n through m>.cbr

Alternatively, how do I trim each file name so that only the numbers are left before the extension? (from issue1.cbr to 1.cbr) via either a .bat or script host file?

werdnanoslen
  • 102
  • 4
  • 7
  • 22
  • You say you're renaming them "...by issue number..." How is the script to know which file should have which number? By peeking into the meta-data in the .cbr file? I don't think you're going to do that purely with batch script. – T.J. Crowder Jun 12 '11 at 13:58
  • Ah, good point if I weren't going to change the .bat every time. First, assume I would edit the .bat every time I want to specify a new range n through m. If you have a suggestion for finding the minimum number in the file group and the maximum number and then setting that as n through m, let me know (would be better but I've never done anything like that) – werdnanoslen Jun 12 '11 at 14:02
  • @werdnanoslen: But even within a batch, you have no guarantee of the order in which Windows will process the `*.cbr` wildcard, so you would effectively be giving the files random names within the range. – T.J. Crowder Jun 12 '11 at 14:03
  • Really? I had no idea. Ok, I've added a bit at the end of my original question, that should be a decent workaround if there aren't other numbers in the file name – werdnanoslen Jun 12 '11 at 14:05
  • also, just curious, how does the computer like to order its operations? How does the batch order usually fall? – werdnanoslen Jun 12 '11 at 14:06
  • @werdnanoslen: The order is completely random as far as your script is concerned. (In fact, it relates to the order in which the directory entries appear in the allocation table.) – T.J. Crowder Jun 12 '11 at 14:08
  • @werdnanoslen: A batch file is just the wrong tool for the job. Recommend using a windows script host file instead, so you can do some string manipulation (I mean, it's easy to rename "issueX.cbr" to "X.cbr", but as soon as it becomes "issueXX.cbr" => "XX.cbr" -- e.g., "issue10.cbr" -- batch falls down again). Or just do a "dir *.cbr /b/one > filename.cmd" and then using your favorite text editor's search and replace to turn that into a bunch of `ren` statements. This may help if you want to continue with batch, though: http://www.robvanderwoude.com/ntset.php – T.J. Crowder Jun 12 '11 at 14:12

2 Answers2

12

Try this batch script.

@echo off
setlocal enabledelayedexpansion
set /a count=0
for /f "tokens=*" %%a in ('dir /b /od *.cbr') do (
 echo ren "%%a" !count!.cbr
 set /a count+=1
)

It renames all the files with a incremental counter. The order of the files is preserved with the /OD option of the DIR command, that sorts the files list by its modified timestamp.

After careful testing, remove the ECHO command.

For more information, read HELP DIR, HELP SET and HELP FOR.

Paul
  • 1,188
  • 1
  • 11
  • 21
PA.
  • 28,486
  • 9
  • 71
  • 95
0
:: REN-sec.cmd ==> Rename files to increment numbers
:: Inspired on -> http://stackoverflow.com/questions/6322329#6324312
:: - (cX) 2017 adolfo.dimare@gmail.com
:: -> CAVEAT: Works on CURRENT directory!
:: - Tested on Win10 64bits
@echo off

if (%1)==()   goto _help
if (%1)==(/?) goto _example

setLOCAL EnableDelayedExpansion
rem            EnableExtensions
if (%1)==(/r) goto _recursive
if (%1)==(/R) goto _recursive
goto _current_dir

:_recursive
for /d %%A in (*.*) do (
      cd "%%~A"
      call %~dpnx0 %1 %2 %3 %4
      rem echo returning -^> call %~dpnx0 %1 %2 %3 %4
      cd ..
)
shift
goto _current_dir

:_current_dir
set /a _count=0
for %%A in (%1) do (
    set /a _count+=1

    rem Execute several times to rename 'crazy' left overs...
    FOR /L %%C IN (1,1,2) DO (
        if exist "%~2!_count!%~3%%~xA" call :skip_count %1 %2 %3 %AA
        if exist "%%~A" if not exist "%~2!_count!%~3%%~xA" ren "%%~A" "%~2!_count!%~3%%~xA"
    )
    if exist "%%~A" echo EXISTS "%%~A"
    REM if not exist "%~2!_count!%~3%%~xA" echo MISSING %~2!_count!%~3%%~xA
)
goto _out

:skip_count
    set /a _count+=1
    if exist "%~2!_count!%~3%%~x4" goto skip_count
goto _out

:_example
echo.
echo %0 USAGE EXAMPLE
echo.
echo X:\Dir\SubDir\^> dir /b
echo etc.
echo La La La.mp3
echo Le Le Le.mp3
echo Lo Lo Lo.mp3
echo Other.txt
echo.
echo X:\Dir\SubDir\^> %0 *.mp3 "" " - Su Fix"
echo.
echo X:\Dir\SubDir\^> dir /b
echo etc.
echo 1 - Su Fix.mp3
echo 2 - Su Fix.mp3
echo 3 - Su Fix.mp3
echo Other.txt
echo.

:_help
echo Rename files to increment numbers
echo.
echo CAVEAT: Works only in CURRENT directory!
echo.
echo %0 [/r] *.ext [prefix] [sufix]
echo:  /?          Help screen
echo   /r          Recurse in directories
echo   *.ext       Simple wildcard (like *.mp3) [NOT *.a.txt]
echo   prefix      Prefix to rename number
echo   sufix       sufix to rename number
echo.
echo When "" is used as prefix no prefix is put before the increment number
echo.
echo X:\Dir\SubDir\^> %0 [/r] [wildcard] [prefix] [sufix]
goto _out

:_out
:: REN-sec.cmd ==> End of file
Adolfo
  • 281
  • 2
  • 5