Board logo

标题: [文件操作] [已解决]如何将某个路径下的所有子文件夹中的文件进行重命名,对文件名中的数字补位 [打印本页]

作者: xinjinjie    时间: 2017-4-1 13:52     标题: [已解决]如何将某个路径下的所有子文件夹中的文件进行重命名,对文件名中的数字补位

本帖最后由 xinjinjie 于 2017-4-5 09:43 编辑

目前通过文件夹改名工具倒是可以比较方便的对所有子文件夹改名,但是所有子文件夹下的文件重命名非常头痛。

现在像用批处理写一个循环处理,但是不知道代码改如何写,求高手指点。

子文件夹已统一命名为“英文_XXX”,xxx是数字,比如"book_001",现在需要循环处理 "book_001"到"book_100"的子文件夹下的所有文件重命名。最主要是不知道该如何用代码表达对子文件夹的"_XXX"进行循环。子文件夹中的文件改名目前是一行改一个文件这种笨方法书写的,可以修改成功,但是必须手动到每个子文件夹中执行该BAT,太低效了 - -

解决方案在21楼,感谢ShowCode的耐心指点。
作者: ShowCode    时间: 2017-4-1 14:34

把你的代码发出来,我帮你改改。
作者: xinjinjie    时间: 2017-4-1 15:30

把你的代码发出来,我帮你改改。
ShowCode 发表于 2017-4-1 14:34


ren        0.jpg        00.jpg

我的代码就这么简单,只是像这样从0开始,写到20左右,现在是不知道该怎么写子文件夹里包含数字的循环处理,这个简单代码的BAT只能手动复制到每个子文件夹里自己运行,太不方便了
作者: ShowCode    时间: 2017-4-1 16:06

回复 3# xinjinjie


改名的规律是什么?
0.jpg -> 00.jpg
1.jpg -> ?
2.jpg -> ?
...
10.jpg -> ?
20.jpg -> ?
作者: xinjinjie    时间: 2017-4-1 20:41

回复  xinjinjie


改名的规律是什么?
0.jpg -> 00.jpg
1.jpg -> ?
2.jpg -> ?
...
10.jpg -> ?
...
ShowCode 发表于 2017-4-1 16:06


文件名的改名规律就是0.jpg -> 00.jpg,1.jpg ->01.jpg,这样。

现在最麻烦的是子文件夹的名称也需要循环,比如d:\book\book_001,d:\book\book_002,这样的子文件夹中需要循环改文件名,而且是所有子文件夹要循环遍历的改,不知道代码该怎么写,还请指教。
作者: ShowCode    时间: 2017-4-1 21:51

回复 5# xinjinjie


    10.jpg 改成 010.jpg 吗?
作者: xinjinjie    时间: 2017-4-1 22:34

回复 6# ShowCode


干脆统一成3位数,1.jpg改为001.jpg,10.jpg改为010.jpg
作者: Nsqs    时间: 2017-4-2 00:04

本帖最后由 Nsqs 于 2017-4-2 00:46 编辑
  1. @PowerShell -c "ForEach($i in (Get-ChildItem '*.jpg' -File -Recurse)){$r=$i.BaseName -match '(\d+)';$m=$matches[1];$f='{0:d3}' -f [int]$m;$n=$i.Name.Replace($m,$f);if (!(Test-Path($n))){Rename-Item $i.FullName $n}}"
复制代码

作者: xinjinjie    时间: 2017-4-2 09:09

回复 8# Nsqs


    基本没看懂,还请指教,哪句是对子文件夹进行遍历的?唯一看出来的就'*.jpg',这个似乎是在获取具体文件的文件名?不过对文件名循环改名直接起作用又是那句代码呢?
作者: Nsqs    时间: 2017-4-2 11:02

回复 9# xinjinjie


    你连测试都不测试还要问有什么效果,测一下不就知道了?
作者: ShowCode    时间: 2017-4-2 11:26

回复 9# xinjinjie


8楼是PowerShell语法
-Recurse 表示遍历子目录
Rename 是重命名
作者: xinjinjie    时间: 2017-4-2 12:29

回复 11# ShowCode


    原来如此,如果是遍历所有子目录的话,确实就不需要去纠结对子目录的名称进行循环的情况了,感谢指点
作者: xinjinjie    时间: 2017-4-2 12:30

回复 10# Nsqs


    感谢指点,下午有时间后就来尝试这个代码的效果。提出疑问是想弄清楚具体的代码对应的具体功能,结果只是结果,过程原理很重要
作者: xinjinjie    时间: 2017-4-2 12:34

回复 8# Nsqs


    如果文件改名时需要更换后缀名,应该把这个代码怎么调整呢?比如,子文件夹中的文件后缀名是".html",需要在改名后都改为“.txt”
作者: xinjinjie    时间: 2017-4-2 21:57

回复 11# ShowCode


    Rename-Item $i.FullName $n,这句代码,似乎就是你说的对文件进行重命名的吧?i.FullName,这里是不是就是在用变量i循环累加数字后,用这个i变量做文件名的前缀?
如果是的话,文件名的后缀如果要修改应该怎么写呢?比如,原文件名后缀是HTML的,循环改名时需要将后缀名改为TXT的。

顺便还想到一个类似的功能顺便一起请教,就是遍历所有子文件夹,删除某个固定文件名或者固定后缀名的文件,用Nsqs分享的这个改名代码应该是修改一下重命名部分的代码就可以的吧?改怎么改呢?
作者: ShowCode    时间: 2017-4-3 17:16

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /s /a-d *.html') do (
  4.     set "f=100%%~ni"
  5.     set "f=!f:~-3!.txt"
  6.     ren "%%i" "!f!"
  7. )
复制代码

作者: xinjinjie    时间: 2017-4-3 19:28

本帖最后由 xinjinjie 于 2017-4-3 19:34 编辑

回复 16# ShowCode


    感谢指点,不过这个代码是删除文件用的还是改名用的?delims 看着像删除命令?
setlocal enabledelayedexpansion 查了一下,是 变量延迟,在这个代码里用它是为了什么效果呢?
另外,对子文件夹进行遍历的代码是哪段呢?如果要用你这个代码来实现,遍历所有子文件夹,删除某个指定文件名或者后缀名的文件,应该怎么修改这个代码呢?
作者: xinjinjie    时间: 2017-4-3 20:23

回复 16# ShowCode


    还发现一个新情况,是文件名的新情况,原本以为文件名只是0.jpg 改为 000.jpg,或者0.html 改为 000.txt,但是有的子文件夹里的文件名还含有非数字的字符,比如book.0.html 需要改为000.txt,book.1.html 需要改为001.txt。个人感觉直接用16L的代码应该不行,虽然那个代码还没完全看懂,但是能大概猜测出"delims=" %%i in ('dir /b /s /a-d *.html')应该是在将文件名的前缀部分用循环的方式进行确认,如果遇到新情况的文件名book.0.html,应该无法获取到吧?对应新情况的文件名book.0.html 这种应该怎么调整16L的代码来达到效果呢?
作者: ShowCode    时间: 2017-4-4 22:09

回复 17# xinjinjie


    dir 命令的 /s 参数可以遍历子文件夹
作者: ShowCode    时间: 2017-4-4 22:11

回复 17# xinjinjie


删除文件非常简单只需要一个 del 命令,它自己的 /s 参数可以遍历子目录。
  1. del /f /q /s *.txt
复制代码

作者: ShowCode    时间: 2017-4-4 22:18

回复 18# xinjinjie


@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /b /s /a-d *.html') do (
    set "f=100%%~ni"
    set "f=!f:book.=!"
    set "f=!f:~-3!.txt"
    ren "%%i" "!f!"
)
作者: xinjinjie    时间: 2017-4-5 08:57

回复 21# ShowCode


    非常感谢指点,我对比了一下16L的代码,只多了一行set "f=!f:book.=!",这个应该是在判断文件名里包含了“book.”这个关键字符内容吧?

还想请教一下3句set语句分别起的作用,还请指点一下。
作者: ShowCode    时间: 2017-4-5 20:45

回复 22# xinjinjie


@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /b /s /a-d *.html') do (
    set "f=100%%~ni"
    echo !f!
    set "f=!f:book.=!"
    echo !f!
    set "f=!f:~-3!.txt"
    echo !f!
    ren "%%i" "!f!"
)

这样观察一下应该能明白吧




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2