以数字系列重命名文件

时间:2017-05-11 12:45:17

标签: batch-file cmd file-rename

所以我使用的应用程序创建了一系列.tif个文件,这些文件的文件名非常烦人,而且这些文件名没有按照字母数字顺序正确排序。我无法改变这个商业软件的行为,所以我必须使用我自己的创造力重命名文件,以便可以按正确的顺序在外部处理它们。例如,创建的文件如下所示:

image.tifimage(2).tifimage(3).tif,...,image(9).tifimage(10).tif,...,image(n).tif

其中 n 是一个不小于2的整数。第一个文件在括号中没有数字。例如,按字母数字排序,列表看起来像:

image.tifimage(10).tifimage(100).tifimage(1000)image(2).tif,...

显然,虽然这是正确的字母数字顺序,但这是不正确的数字顺序。因此,借助一些批处理命令,我创建了这个:

@echo off & setlocal EnableDelayedExpansion 

ren "image.tif" "a.tif"
ren "image(1).tif" "b.tif"
ren "image(2).tif" "c.tif"
ren "image(3).tif" "d.tif"
ren "image(4).tif" "e.tif"
ren "image(5).tif" "f.tif"
ren "image(6).tif" "g.tif"
ren "image(7).tif" "h.tif"
ren "image(8).tif" "i.tif"
ren "image(9).tif" "j.tif"

set a=1
for /f "delims=" %%i in ('dir /b *.tif') do (
  ren "%%i" "!a!.tif" 
  set /a a+=1
) 

这至少会纠正前十个文件的名称,因为我经常处理少于100个文件。 for 循环是我在stackoverflow上找到的一个片段,它将字母数字文件重命名为整数,从1开始直到文件数。

我遇到的问题是此循环仍会创建1.tif之前的10.tif100.tif2.tif

我已经看到使用%02d将数字格式化为01,02,10等。是否有人知道如何在上面显示的循环中语法包含它?

或者,如果任何人都可以想出一个更优雅的方法来将这些文件重命名为合适的字母数字顺序,那将非常感激。我觉得我的解决方案非常笨拙。

4 个答案:

答案 0 :(得分:1)

填充数字的%02d约定是printf,不适用于Windows cmd环境或批处理脚本。 PowerShell有something similar,但不是纯批处理。但是,您可以使用variable substring manipulation轻松填充数字。

set /a a=0
for /f "delims=" %%I in ('dir /b *.tif') do (
    set "idx=00!a!"
    ren "%%~I" "!idx:~-3!%%~xI"
    set /a a += 1
)

如果您希望保留image(idx).tif的命名约定,同时确保TIF文件保持其预期的连续顺序,则延迟解决方案可能是使用prename.bat并使用regexp重命名。

prename /v "s/\((\d)\)/(00\1)/" *.tif
prename /v "s/\((\d\d)\)/(0\1)/" *.tif

答案 1 :(得分:1)

quartz scheduler

答案 2 :(得分:1)

@echo off
setlocal EnableDelayedExpansion 
set /a max=99&set /a numlen=2
if exist "image(100).tif" set /a max=999&set /a numlen=3
for /L %%a in (1,1,%max%) do if exist "image(%%a).tif" set /a newnum=1000+%%a&if not exist "image(!newnum:~-%numlen%!).tif" echo(ren "image(%%a).tif" "image(!newnum:~-%numlen%!).tif"
set /a max+=1
echo(ren "image.tif" "image(!newnum:~-%numlen%!).tif"

[未测试]

如果"图像(100).tif"存在,那么我们需要重命名为(001)..(999)。如果没有,到(01)..(99),那么数字长度将是3或2。

对于每个名称1..max,如果文件存在,则计算1000 +文件编号;取最后3或2个字符并重命名。仅尝试重命名目的地名称是否存在,因此(6)将重命名为(006)或(06),(15)至(05)或跳过为(15)=(15)和(123)将也可以跳过(123)=(123)
最后,将image.tif文件重命名为(000)或(00)

请注意,这只是echo所需的命令以允许验证。验证后,将echo(ren更改为ren以实际执行重命名。

答案 3 :(得分:1)

cmd中,没有像%02d这样的格式字符串。但是,您可以使用dir /B来检索文件的简单列表,findstr来过滤那些名称中带有带括号的数字后缀或者根本没有这样的后缀的文件,for /F来捕获生成文件名并将其拆分为依赖()sub-string expansion的标记来执行实际的左零填充,如下例所示:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_LOCATION=."    & rem // (directory containing the files to rename)
set "_PATTERN=*.tif" & rem // (search pattern for the files to rename)
set /A "_DIGITS=4"   & rem // (number of proposed digits from 1 to 10)
set "_REGEX1=^[^()][^()]*([0-9][0-9]*)\.tif$" & rem // (filter expression)
set "_REGEX2=^[^()][^()]*\.tif$"              & rem // (filter expression)
rem // (the filter expressions ensure wrongly named files not to be processed)

rem // Build zero-padding string:
set "PAD=0000000000" & call set "PAD=%%PAD:~-%_DIGITS%%%"
rem // Loop through all matching files:
for /F "tokens=1-3 delims=()" %%A in ('
    dir /B /O:N "%_PATTERN%" ^| findstr /I /R /C:"%_REGEX1%" /C:"%_REGEX2%"
') do (
    rem // Check if current file name contains a parenthesised numeric suffix:
    if not "%%B"=="" (
        rem // Numeric suffix found, so store file name parts and pad number:
        set "LEFT=%%A" & set "MID=%PAD%%%B" & set "RIGHT=%%C"
        setlocal EnableDelayedExpansion
        ECHO rename "!LEFT!(%%B)!RIGHT!" "!LEFT!(!MID:~-%_DIGITS%!)!RIGHT!"
        endlocal
    ) else (
        rem // No numeric suffix encountered, so append zero-suffix:
        ECHO rename "%%A" "%%~nA(%PAD%)%%~xA"
    )
)

endlocal
exit /B

成功验证脚本的相应输出后,删除大写ECHO命令以实际重命名任何文件。

该脚本将image.tif之类的文件重命名为image(0000).tif(假设最初没有名为image(0).tif的文件)。如果您不希望这种情况发生,只需从/C:"%_REGEX2%"命令行中删除findstr部分。