Windows/Linux下的批量重命名


Windows: 批量重命名

1.批量重命名扩展名

CMD提供一个简单有效的命令:
rename *.tm3 *.mp3

但是该命令只能批量修改本层目录下的文件名,如果希望递归修改那么Powershell就是最佳选择:

get-childitem *.tm3 -recurse| rename-item -newname { $_.name -replace “.tm3″,”.mp3″ }

如果省略命令选项-recurse,那么也是作用于本层目录。

2.删除扩展名

CMD命令:
rename *.tm3 *.

Powershell命令:
get-childitem * | rename-item -newname { $_.name -replace “.tm3″,”” }

3.追加扩展名

CMD需要先删除扩展名后再添加:
rename * *.mp3

Powershell是更好的选择:
get-childitem | rename-item -newname { $_.Name + “.jpg” }

4.按数字增量批量重命名{递归处理子目录,而且是先从子目录开始计算}

get-childitem *.mp3 -recurse | ForEach-Object -begin { $count=1 } -process { rename-item $_ -NewName “QQMusic_$count.mp3”; $count++ }

Reference:
[1] Batch File Rename with Windows PowerShell [ http://tweaks.com/windows/49459/batch-file-rename-with-windows-powershell/ ]
[2] Windows: 批量重命名 | Lesca技术宅 http://lesca.me/archives/batch-file-rename-with-cmd-or-powershell.html
———————–

::遍历目录,去掉 tmp 扩展名
for /R . %%f in (*.tmp) do ren %%f %%~nf

上面的命令是为了去掉“.tmp”这个扩展名,所以用 for 命令来遍历。但如果仅仅是修改扩展名则更简单,只要运行 ren *.bat *.txt 即可。另附一段好玩的批处理:将下面的代码保存成 bat 文件,双击运行就能将当前目录下的 jpg 图片文件按 1-N 的顺序重新命名(用来批量处理从网上下载下来的图片非常有效)。大家可以自行修改扩展名。

::b.bat
@echo off
::开启延迟的变量扩充
setlocal enabledelayedexpansion
::计数器
set /a i=1
for /R . %%f in (*.jpg) do (
ren %%f !i!.jpg
set /a i=!i!+1
)

批量重命名汇总
只要大家悉心观察,还有很多好玩的问题可以去解决。现将各种批量重命名的批处理代码汇总如下:

按顺序重命名文件
将当前目录下不规则命名的 jpg 文件依次重命名成 1.jpg、2.jpg 等:
@echo off
::开启延迟的变量扩充
setlocal enabledelayedexpansion
::计数器
set /a i=1
for %%f in (*.jpg) do (
ren %%f !i!.jpg
set /a i=!i!+1
)

递归地处理子目录文件
其他代码都是处理当前目录下的文件,这个程序给出递归处理子目录的模板(for /R . %f in (*) do @echo %f):
for /R . %f in (*) do echo %f

去掉文件名日期前缀
需求出处:http://www.oschina.net/code/snippet_125800_4330
for %f in (*.sc2replay) do for /F “delims=- tokens=4*” %t in (“%f”) do move %f %t

替换文件名中的字串
需求出处:http://www.oschina.net/code/snippet_143158_4337
@echo off
setlocal enabledelayedexpansion
for %%f in (*) do (
set name=%%f
move !name! !name:%1=%2!
)
这个批处理接收两个命令行参数。比如你将上述代码保存成 rn.bat,执行 rn a b,程序就会把当前目录下所有文件名中的字母 a 替换成 字母 b。

在 for 语句中使用 /R 选项的话就可以递归到子目录去。Linux 下或 Cygwin 里用 shell 也能做到类似的功能,比如下面的代码是把当前目录文件中的 abc 替换成 def:
for f in *; do mv $f ${f/abc/def}; done
@echo off
setlocal enabledelayedexpansion
for %%f in (*) do (
set name=%%~nf
set ext=%%~xf
move !name!.!ext! !name:%1=%2!.!ext!
)

将文件名变成大写
需求出处:http://www.oschina.net/code/snippet_99867_4340
:: convert file name to upper case
@echo off
setlocal enabledelayedexpansion
set LowerCase=abcdefghijklmnopqrstuvwxyz
set UpperCase=ABCDEFGHIJKLMNOPQRSTUVWXYZ

for %%f in (*.txt) do (
set string=%%f
for /L %%d in (0,1,25) do (
set from=!LowerCase:~%%d,1!
set to=!UpperCase:~%%d,1!
call :convert !from! !to!
)
move %%f !string!
)

goto end

:convert
set string=!string:%1=%2!
goto :eof

:end

 

Shell版批量重命名
功能和上述批处理一致,但使用bash来完成

按顺序重命名文件
将当前目录下不规则命名的 jpg 文件依次重命名成 1.jpg、2.jpg 等
i=1
for f in *.jpg; do
mv $f ${i}.jpg
((i++))
done

递归地处理子目录文件
其他代码都是处理当前目录下的文件,这个程序给出递归处理子目录的模板
# 处理子目录文件
find . -name ‘*.log’ -type f | while read p; do
fname=$(basename $p)
# do some thing for fname
mv $p $(dirname $p)/$fname
done

去掉文件名日期前缀
需求出处:http://www.oschina.net/code/snippet_125800_4330
for f in *.sc2replay; do mv $f ${f##*-}; done

替换文件名中的字串
需求出处:http://www.oschina.net/code/snippet_143158_4337
for f in *; do
name=${f%.*}
ext=${f##*.}
mv $f `sed ‘s/e/x/g’ <<< $name`.$ext
done

将文件名变成大写
需求出处:http://www.oschina.net/code/snippet_99867_4340
for f in *; do
name=${f%.*}
ext=${f##*.}
mv $f `tr ‘a-z’ ‘A-Z’ <<< $name`.$ext
done

原文链接:http://zzp.me/2009-08-29/batch-rename-files/

, , ,

《“Windows/Linux下的批量重命名”》 有 7 条评论

  1. 用PowerShell进行文本解析
    `
    PS C:> ipconfig | Select-String ‘IPv4’
    IPv4 Address. . . . . . . . . . . : 192.168.2.112

    PS C:> $data = ipconfig | select-string ‘IPv4’
    PS C:> [regex]::Matches($data,”b(?:d{1,3}.){3}d{1,3}b”) | Select-Object -ExpandProperty Value
    192.168.2.112
    `

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注