文件名增量编号"测试xx - Random.txt"在批处理脚本?

时间:2014-07-16 03:56:20

标签: batch-file

有没有办法简单地增加文件名中的数字?

文件名不同,但数字总是在同一个地方。

就像这样:

Chrome - Browsing 23 - Crash Report

Chrome - Browsing 24 - Navigation

因此,应该很容易分辨数字的位置,因为它总是位于完全相同的位置,只有更改后的文本。

我偶然在许多文件上输错了数字,复制了一个数字,所以所有数字都返回1,并且需要很长时间才能保留它们。

有没有办法用批处理脚本执行此操作?

或者类似的东西?

由于

3 个答案:

答案 0 :(得分:1)

这是可能的。

给出两个文件

Chrome - Browsing 23 - Crash Report
Chrome - Browsing 24 - Navigation

并将此脚本另存为test.bat

setlocal ENABLEDELAYEDEXPANSION
@echo off

for %%f in ("Chrome - Browsing*") do (
    set TEMP_FILENAME=%%f
    set TEMP_NUM=!TEMP_FILENAME:~17,4!
    set /A TEMP_NUM2=!TEMP_NUM!+1
    echo ren "!TEMP_FILENAME:~0,17!!TEMP_NUM!!TEMP_FILENAME:~21!" "!TEMP_FILENAME:~0,17! !TEMP_NUM2! !TEMP_FILENAME:~21!"
)

你得到的是重命名说明:

ren "Chrome - Browsing 23 - Crash Report" "Chrome - Browsing 24 - Crash Report"
ren "Chrome - Browsing 24 - Navigation" "Chrome - Browsing 25 - Navigation"

如果您将echo ren更改为ren,它将实际运行命令。首先进行备份,如果数字达到三位数或一位数,或者间距不同等,它可能会中断。

答案 1 :(得分:1)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir"

:: This is just a listing for demonstration purposes
DIR "%sourcedir%\Chrome - Browsing *"

FOR /L %%a IN (102,-1,95) DO (
 FOR /f "tokens=4*" %%g IN (
  'dir /b /a-d "%sourcedir%\Chrome - Browsing %%a*" '
  ) DO (
   SET /a newnum=1+%%a
   ECHO(REN "%sourcedir%\Chrome - Browsing %%a*" "Chrome - Browsing !newnum! %%h"
  )
 )

GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。

为了测试目的,所需的REN命令仅为ECHO在您确认命令正确后,将ECHO(REN更改为REN以实际重命名文件。

这是一个测试运行结果;首先是dir列表,然后生成rename

 Volume in drive U has no label.
 Volume Serial Number is 0460-0000

 Directory of U:\sourcedir

16/07/2014  14:25                 0 Chrome - Browsing 95 - Crash Report
16/07/2014  14:25                 0 Chrome - Browsing 97 - Crash Report
16/07/2014  14:25                 0 Chrome - Browsing 99 - Crash Report
16/07/2014  14:25                 0 Chrome - Browsing 101 - Crash Report
16/07/2014  14:25                 0 Chrome - Browsing 96 - Navigation
16/07/2014  14:25                 0 Chrome - Browsing 98 - Navigation
16/07/2014  14:25                 0 Chrome - Browsing 100 - Navigation
16/07/2014  14:25                 0 Chrome - Browsing 102 - Navigation
               8 File(s)              0 bytes
               0 Dir(s)   2,139,062,272 bytes free
REN "U:\sourcedir\Chrome - Browsing 102*" "Chrome - Browsing 103 - Navigation"
REN "U:\sourcedir\Chrome - Browsing 101*" "Chrome - Browsing 102 - Crash Report"
REN "U:\sourcedir\Chrome - Browsing 100*" "Chrome - Browsing 101 - Navigation"
REN "U:\sourcedir\Chrome - Browsing 99*" "Chrome - Browsing 100 - Crash Report"
REN "U:\sourcedir\Chrome - Browsing 98*" "Chrome - Browsing 99 - Navigation"
REN "U:\sourcedir\Chrome - Browsing 97*" "Chrome - Browsing 98 - Crash Report"
REN "U:\sourcedir\Chrome - Browsing 96*" "Chrome - Browsing 97 - Navigation"
REN "U:\sourcedir\Chrome - Browsing 95*" "Chrome - Browsing 96 - Crash Report"

诀窍是以反向数字顺序执行重命名(10295需要更改以适应您要重新编号的范围,显然) 。如果按正常顺序尝试重命名,则可能具有该情况

16/07/2014  14:25                 0 Chrome - Browsing 98 - Navigation
16/07/2014  14:25                 0 Chrome - Browsing 99 - Navigation

会产生(增加制度)

REN "U:\sourcedir\Chrome - Browsing 98*" "Chrome - Browsing 99 - Navigation"
REN "U:\sourcedir\Chrome - Browsing 99*" "Chrome - Browsing 100 - Navigation"

显然,第一次重命名(98)将失败,因为目标名称(99)已经存在。


编辑:适应一般情况(字数更多字)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir"
SET "pattern=word word - word word"

:: This is just a listing for demonstration purposes
DIR "%sourcedir%\%pattern%*"

:: De-luxe enhancement : automatically determine # of words in pattern (+1)
IF NOT "%pattern:~-1%"==" " SET "pattern=%pattern% "
SET /a words=1
SET "nwords=%pattern%"
:adwpl
SET /a words+=1
SET "nwords=%nwords:* =%"
IF DEFINED nwords GOTO adwpl

FOR /L %%a IN (102,-1,95) DO (
 FOR /f "tokens=%words%*" %%g IN (
  'dir /b /a-d "%sourcedir%\%pattern%%%a*" '
  ) DO (
   SET /a newnum=1+%%a
   ECHO(REN "%sourcedir%\%pattern%%%a*" "%pattern%!newnum! %%h"
  )
 )

GOTO :EOF

现在做大多数模式......只需设置你的模式。

答案 2 :(得分:0)

在我的freebsd系统上,它就是这个。我假设它也可以在debian linux上运行。 它是一个小脚本,它不仅可以让你增加,而且可以用另一个数字添加/减去文件名中的任何数字。

renumber.sh

#!/bin/bash
find * -name "*$1*" -print0 | while IFS= read -r -d '' file; do
        filename=$(basename "$file")
        extension=${filename##*.}
        filename=${filename%.*}
        num=$(echo "$filename" | sed "s/.*$2\([0-9]*\)$3.*/\1/")
        firstpart=$(echo "$filename" | sed "s/\(.*$2\)$num.*/\1/")
        lastpart=$(echo "$filename" | sed "s/.*$num\($3.*\)/\1/")
        addednum=$4
        changednum=$((num+addednum))
        echo "$num --> $changednum --> $firstpart$changednum$lastpart.$extension"
        mv -i "$filename.$extension" "$firstpart$changednum$lastpart.$extension"
done

现在命令语法是

renumber.sh contAINS before after -20

参数1(此处" contAINS")将文件限制为包含此字符串的文件。你可以使用一个空字符串""在这里得到他们所有。

参数2(此处"之前")是数字前面的前缀或字符串。也可以使用""

将其设置为空

参数3(此处""之后)是后缀,紧跟在数字后面。使用""设置为空。

参数4(此处" -20")是要添加的数字。

当我在包含以下文件的文件夹中运行

EddycontAINS5678blablabefore120afterbla2345.txt
TomcontAINS1000_before121afterbla.txt
contAINS_12_before21after.txt
100before34aftercontAINS.app

它会将文件更改为

EddycontAINS5678blablabefore100afterbla2345.txt
TomcontAINS1000_before101afterbla.txt
contAINS_12_before1after.txt
100before14aftercontAINS.app