在cmd中重命名多个文件

37

如果我有一个目录中有多个文件,想要在它们的文件名后添加一些内容,但不包括扩展名,我该如何做?

我尝试了以下操作,测试文件为file1.txtfile2.txt

ren *.txt *1.1.txt

这会将文件改名为file1.1.txtfile2.txt1.1.txt

我希望文件名为file1 1.1.txtfile2 1.1.txt

从命令提示符(cmd)能否实现呢?还是需要批处理(bat)文件来完成?PowerShell呢?


有很多文件吗? - Panama Jack
一个文件夹里大约有90个。 - Morne
1
如果您愿意,也可以仅使用UI完成此操作。选择所有文件,将其中一个重命名为“file”,它将显示为file(1),file(2),file(3),file(4)等。 - Gray
@Morne,你也可以使用类似 Massive File Renamer 这样的工具。http://superuser.com/a/730292/78897 - Pacerier
10个回答

31

确保最长名称中的字符数小于 ? 的数量:

ren *.txt "???????????????????????????? 1.1.txt"

请参阅Windows RENAME命令如何解释通配符?以获取更多信息。

新解决方案-2014/12/01

对于那些喜欢正则表达式的人,有一个名为JREN.BAT的混合JScript/batch命令行实用程序,可在XP及以上任何版本的Windows上运行。

jren "^.*(?=\.)" "$& 1.1" /fm "*.txt"

或者

jren "^(.*)(\.txt)$" "$1 1.1$2" /i

4
文件名的最大长度为255个字符,但在大多数情况下的实际限制要小得多,因为Windows用户界面支持的最大路径长度为259个字符。总路径长度包括卷、文件夹和文件名信息,以及一个空终止符。请参阅http://msdn.microsoft.com/en-us/library/aa365247.aspx获取更多信息。 - dbenham
感谢介绍jren,它正是我所需要的,简单、短小、快速。顺便说一句,使用它可以使用速记字符类,如\d\w - Armfoot
@Armfoot - 是的 - JREN使用标准的JSCRIPT正则表达式,因此支持简写字符类。您可以阅读Microsoft正则表达式语法文档 - dbenham

22

步骤 1:

选择所有文件(ctrl + A)

步骤 2:

然后选择重命名选项

enter image description here

步骤 3:

选择您的文件名... 例如:myfile

它会自动重命名为 myfile (01), myfile (02),...

如果您想要替换空格和括号,请继续步骤 4

步骤 4:

从当前文件夹中打开 Windows Powershell

enter image description here

步骤 5:

将空格替换为下划线(_)。

 dir | rename-item -NewName {$_.name -replace [Regex]::Escape(" "),"_"}

步骤6:

替换开括号

 dir | rename-item -NewName {$_.name -replace [Regex]::Escape("("),""}

替换右括号

 dir | rename-item -NewName {$_.name -replace [Regex]::Escape(")"),""}

1
这个PowerShell很棒。谢谢。 - Stephen Pefanis
3
可能要感谢 https://www.howtogeek.com/111859/how-to-batch-rename-files-in-windows-4-ways-to-rename-multiple-files ? - sancho.s ReinstateMonicaCellio
我对文件夹中所有图像和视频进行了相同的重命名操作。但是当文件类型更改时,编号会再次从1开始。 - undefined
请你帮我检查一下这个问题:https://stackoverflow.com/questions/77478281/rename-all-the-items-in-a-folder-without-checking-the-type-of-file-in-windows-os - undefined

22
for /f "delims=" %%i in ('dir /b /a-d *.txt') do ren "%%~i" "%%~ni 1.1%%~xi"

如果您使用简单的for循环而没有使用/f参数,则已经重新命名的文件将再次被重命名。


1
"n"在"%%ni 1.1%%~xi"中代表什么?我不明白它是如何工作的... - ocrampico
阅读for文档,它解释了变量占位符的工作原理。 - Remy Lebeau

13

+1 我认为这是最容易记住的,比 cmd 的 for 语法简单得多,但缺点是它必须为每个迭代生成一个新的 cmd.exe 进程。这使得它非常低效和慢。 - Amit Naidu

4

试用这个批量重命名工具。它非常好用,也许不必重复造轮子。如果您不需要脚本,这是一个不错的选择。


如果您不想编写脚本,这仍然是一个不错的解决方案。 - karlis

4
@echo off
for %%f in (*.txt) do (
    ren "%%~nf%%~xf" "%%~nf 1.1%%~xf"
)

1
对于某些人无法运行的代码:for %f in (*.txt) do (ren "%nf%xf" "%nf 1.1%xf") - nyconing

2
我在Supperuser.com的一个小评论中发现了以下内容:

@JacksOnF1re - 我的答案中添加了新信息/技巧。你实际上可以使用一个晦涩的正斜杠技巧删除你的"Copy of"前缀:ren "Copy of .txt" "////////"

关于Windows RENAME命令如何解释通配符?,请参见此线程中dbenham答案
我的问题稍有不同,我想给文件添加一个前缀并从开头删除我不需要的内容。在我的情况下,我有几百个枚举文件,例如:
SKMBT_C36019101512510_001.jpg
SKMBT_C36019101512510_002.jpg
SKMBT_C36019101512510_003.jpg
SKMBT_C36019101512510_004.jpg
:
:

现在,我想将它们分别重命名为(相册07图片#):
A07_P001.jpg
A07_P002.jpg
A07_P003.jpg
A07_P004.jpg
:
:

我只用了一行命令,它就像魔法一样奏效了:
ren "SKMBT_C36019101512510_*.*" "/////////////////A06_P*.*"

注意:
  1. 引用 (") "<Name Scheme>" 不是一个选项,否则它不起作用,在我们的例子中:"SKMBT_C36019101512510_*.*""/////////////////A06_P*.*" 被引用。
  2. 我必须准确地计算要删除的字符数并为我的新字符留出空间:实际上,A06_P 代替了 2510_,而 SKMBT_C3601910151 则通过使用恰好数量的斜杠 /////////////////(17个字符)被删除。
  3. 我建议在应用上述方法之前复制您的文件(备份)。

1
我尝试直接将Endoro的命令(感谢Endoro)粘贴到命令提示符中以添加文件前缀,但遇到了错误。 解决方法是将%%减少为%,因此:
for /f "delims=" %i in ('dir /b /a-d *.*') do ren "%~i" "Service.Enviro.%~ni%~xi"

0

我也曾为此感到困惑...不喜欢Windows在批量重命名时添加的括号。在我的研究中,我决定使用PowerShell编写脚本。非常简单,而且效果很好。现在我可以随时使用它来批处理文件重命名...这是经常需要的。我拍摄了数百张照片,相机将它们命名为IMG1234.JPG等...

以下是我编写的脚本:

# filename: bulk_file_rename.ps1
# by: subcan
# PowerShell script to rename multiple files within a folder to a 
# name that increments without (#)
# create counter
$int = 1
# ask user for what they want
$regex = Read-Host "Regex for files you are looking for? ex. IMG*.JPG "
$file_name = Read-Host "What is new file name, without extension? ex. New Image "
$extension = Read-Host "What extension do you want? ex. .JPG "
# get a total count of the files that meet regex
$total = Get-ChildItem -Filter $regex | measure
# while loop to rename all files with new name
while ($int -le $total.Count)
{
    # diplay where in loop you are
    Write-Host "within while loop" $int  
    # create variable for concatinated new name - 
    # $int.ToString(000) ensures 3 digit number 001, 010, etc
    $new_name = $file_name + $int.ToString(000)+$extension
    # get the first occurance and rename
    Get-ChildItem -Filter $regex | select -First 1 | Rename-Item -NewName $new_name
    # display renamed file name
    Write-Host "Renamed to" $new_name
    # increment counter
    $int++
}

我希望这对某个人有所帮助。

subcan


0

这适用于您的特定情况:

ren file?.txt "file? 1.1.txt" 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接