返回列表 发帖

[文件操作] BAT怎样把文件夹和文件夹下的文件都更改格式重命名[略有难度有断序]?

本帖最后由 playinthesky 于 2013-12-15 18:48 编辑

原始:

文件夹格式

2012-永久-001_image
2012-永久-002_image
2012-永久-003_image
2012-永久-004_image
2012-永久-005_image
2012-永久-006_image
2012-永久-007_image

文件夹 2012-永久-001_image  下
2012-永久-001_page1_0.jpeg
2012-永久-001_page2_0.jpeg
2012-永久-001_page3_0.jpeg
2012-永久-001_page4_0.jpeg
2012-永久-001_page5_0.jpeg

文件夹 2012-永久-002_image  下
2012-永久-002_page1_0.jpeg
2012-永久-002_page2_0.jpeg
2012-永久-002_page3_0.jpeg
2012-永久-002_page4_0.jpeg

....

以及类推,有成千上万个

目标格式:

文件夹格式

J027-2012-永久-0001
J027-2012-永久-0002
J027-2012-永久-0003
J027-2012-永久-0004
J027-2012-永久-0005
J027-2012-永久-0006
J027-2012-永久-0007

文件夹 J027-2012-永久-0001  下

J027-2012-永久-0001-0001.jpeg
J027-2012-永久-0001-0002.jpeg
J027-2012-永久-0001-0003.jpeg
J027-2012-永久-0001-0004.jpeg
J027-2012-永久-0001-0005.jpeg

文件夹 J027-2012-永久-0002  下

J027-2012-永久-0002-0001.jpeg
J027-2012-永久-0002-0002.jpeg
J027-2012-永久-0002-0003.jpeg
J027-2012-永久-0002-0004.jpeg
J027-2012-永久-0002-0005.jpeg

我的思路:想将所有文件夹下的JEPG文件
@echo off
for /r %%i in (*.jpeg) do (
echo %%i>>whole.txt
move %%i %~dp0)
pauseCOPY
然后重命名,重命名好之后,在用重命名文件夹的软件,批量建立我所需要格式的文件夹,然后我再
@echo off
for %%i in (*.jpeg) do (
for /f "tokens=*" %%a in (whole.txt) do (
echo %%a | findstr "%%i" && move %%i %%a))  
pasueCOPY
但是我发现效率很低下,移动的过程中,非常的慢。

能不能有高手,可以直接批处理的时候,将我上面所说的两步合成一步处理了,另外就是原始文件中文件的序列都是3位数的,但是要求均为四位且在年份之前需要加上 J027- 的标注,去除文件夹名后 _image的标注

后面各个文件夹下的文件名,也需要将_page和_0过滤,文件的名字,要把-002 从三位提升到四位变成0002,也同样要加上 J027- 的标注。所以感觉很难。

很不好意思,我又来了,我之前忘记考虑了一个情况,就是文件夹和文件夹下的文件均有断续的。这样能否解决?????

文件夹格式

2012-永久-001_image
2012-永久-002_image
2012-永久-009_image
2012-永久-010_image
2012-永久-015_image
2012-永久-017_image
2012-永久-250_image

文件夹 2012-永久-001_image  下
2012-永久-001_page1_0.jpeg
2012-永久-001_page2_0.jpeg
2012-永久-001_page7_0.jpeg
2012-永久-001_page9_0.jpeg
2012-永久-001_page10_0.jpeg

文件夹 2012-永久-002_image  下
2012-永久-002_page1_0.jpeg
2012-永久-002_page2_0.jpeg
2012-永久-002_page3_0.jpeg
2012-永久-002_page12_0.jpeg

文件夹 2012-永久-009_image  下
2012-永久-009_page1_0.jpeg
2012-永久-009_page2_0.jpeg
2012-永久-009_page6_0.jpeg
2012-永久-009_page9_0.jpeg

文件夹 2012-永久-010_image  下
2012-永久-010_page1_0.jpeg
2012-永久-010_page2_0.jpeg
2012-永久-010_page3_0.jpeg
2012-永久-010_page27_0.jpeg

文件夹 2012-永久-015_image  下
2012-永久-010_page1_0.jpeg
2012-永久-010_page12_0.jpeg
2012-永久-010_page17_0.jpeg
2012-永久-010_page29_0.jpeg

文件夹 2012-永久-017_image  下
2012-永久-002_page1_0.jpeg
2012-永久-002_page18_0.jpeg
2012-永久-002_page28_0.jpeg
2012-永久-002_page61_0.jpeg

文件夹 2012-永久-250_image  下
2012-永久-002_page1_0.jpeg
2012-永久-002_page2_0.jpeg
2012-永久-002_page99_0.jpeg
2012-永久-002_page170_0.jpeg

.......

以及类推,有成千上万个

因为有断续,所以如果用计数器补零的办法,就会照成原先的序列混乱,能否保证原先的排序情况,进行补零,先谢过各位高手了!





执行好心人的BAT处理之后



期待解决
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

@echo off&setlocal enabledelayedexpansion
set "dn=10000"
for /d %%a in (2012-永久-*) do (
    pushd "%%a"
    set/a dn+=1,fn=10000
    for %%b in (2012-永久-*.jpeg) do (
        set/a fn+=1
        ren "%%b" "J027-2012-永久-!dn:~-4!-!fn:~-4!.jpeg"
    )
    popd
    ren "%%a" "J027-2012-永久-!dn:~-4!"   
)COPY
自己复制几个文件夹测试一下。
1

评分人数

初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

回复 2# xxpinqz


    好的,我试试看,谢谢高手帮助。

TOP

回复 2# xxpinqz


    可行,大赞,你真厉害!

TOP

回复 2# xxpinqz


    很不好意思,我又来了,我之前忘记考虑了一个情况,就是文件夹和文件夹下的文件均有断续的。这样能否解决?????

TOP

回复 5# playinthesky
只适合你上面举例的文件及目录名:
@echo off&setlocal enabledelayedexpansion
for /d %%a in (2012-永久-*) do (
    pushd "%%a"
    for /f "tokens=3 delims=-_" %%i in ("%%a") do set "dn=0000%%i"
    for %%b in (2012-永久-*.jpeg) do (
        for /f "tokens=3 delims=e_" %%i in ("%%b") do set "fn=0000%%i"
        ren "%%b" "J027-2012-永久-!dn:~-4!-!fn:~-4!.jpeg"
    )
    popd
    ren "%%a" "J027-2012-永久-!dn:~-4!"   
)COPY
上面的写法,改名的文件名前缀部分与目录名相同。
自己测试一下。
有问题举一两个表述清晰的例子即可,不用发那么多图.
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

本帖最后由 benton 于 2013-12-15 23:38 编辑

生成测试环境:
@echo off&SETLOCAL ENABLEDELAYEDEXPANSION
set ccd=%cd%
for /l %%a in (1,1,20) do (
    set /a n-=1
    set cn=0000%%a
    if !n! lss 5 (
    set /a n=!random:~-1!
    md %ccd%\2012-永久-!cn:~-3!_image
    cd /d %ccd%\2012-永久-!cn:~-3!_image
       for %%d in (%%a !random! !random!) do (
set cm=0000%%d
         for /l %%b in (1,1,20) do (
    set /a m-=1
    if !m! lss 5 (
    set /a m=!random:~-1!
if "00!random:~-1!" neq "00%%b" echo;>2012-永久-!cm:~-3!_page%%b_0.jpeg
    )
)
       )
    )
)
cd /d %ccd%COPY
处理代码:
@echo off&SETLOCAL ENABLEDELAYEDEXPANSION
set ccd=%cd%
for /d %%a in (2012-永久*) do (
for /f "delims=-_ tokens=1-4" %%1 in ("%%a") do (
    set sn=00%%3
    set strd=j027-%%1-%%2-!sn:~-4!
    pushd %%a
    echo;正在处理目录 "%%a" 到 "!strd!" ……
    for /f %%b in ('dir /b *.jpeg') do (
set str=%%b
for /f "delims=-_ tokens=1-4" %%1 in ("!str:page=!") do (
set stre=000%%3
set strf=000%%4
ren "%%b" "j027-%%1-%%2-!stre:~-4!-!strf:~-4!.jpeg"
)
    )
    popd
    move "%%a" "!strd!"
)
)
echo;完成
pauseCOPY

TOP

楼主所说的[断续],和配图,我看了半天也没搞懂,不知道楼主想咋搞啊?

目录名咋搞? 文件名咋搞?
2012-永久-001_image    ----> J027-2012-永久-0001
2012-永久-002_image    ----> J027-2012-永久-0001
2012-永久-009_image    ----> J027-2012-永久-0009  么?
2012-永久-010_image
2012-永久-015_image
2012-永久-017_image
2012-永久-250_image


每个目录中的目的文件名,我看和源文件名无关,[只是改名后的目录名]+ [-0001]  ,    [-0002] ,等等这样?
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

回复 8# PowerShell


2012-永久-001_image    ----> J027-2012-永久-0001
2012-永久-002_image    ----> J027-2012-永久-0002
2012-永久-009_image    ----> J027-2012-永久-0009  
2012-永久-010_image   
2012-永久-015_image
2012-永久-017_image
2012-永久-250_image

把2012前面加上 J027,将_image去除,但是有2001年到2012年。

TOP

看楼主还在纠结  7楼道不能满足吗

TOP

楼主,现在解决了吗

TOP

返回列表