重命名文件夹中的多个文件,添加前缀 (Windows)

Posted

技术标签:

【中文标题】重命名文件夹中的多个文件,添加前缀 (Windows)【英文标题】:Rename multiple files in a folder, add a prefix (Windows) 【发布时间】:2014-01-19 10:14:34 【问题描述】:

我想批量重命名文件夹中的文件,将文件夹名称作为新名称的前缀。即C:\house chores\ 中的文件将全部重命名为house chores - $old_name

【问题讨论】:

【参考方案1】:

选项 1:使用 Windows PowerShell

打开窗口菜单。 键入:“PowerShell”并打开“Windows PowerShell”命令窗口。

转到包含所需文件的文件夹:例如cd "C:\家务" 注意:如果涉及空格,地址必须包含引号“”。

您可以使用 'dir' 查看文件夹中的所有文件。使用“|”将为后面的命令输出 'dir' 的输出。

注意:“dir”是“Get-ChildItem”的别名。请参阅:wiki: cmdlets。 可以提供更多功能。例如'dir -recurse' 输出所有文件、文件夹和子文件夹。

如果我只想要一系列文件怎么办?

而不是“目录|”我可以使用:

dir | where-object -filterscript ($_.Name -ge 'DSC_20') -and ($_.Name -le 'DSC_31') |

以目录名为前缀的批量重命名:

dir | Rename-Item -NewName $_.Directory.Name + " - " + $_.Name

选项 2:使用命令提示符

在文件夹中按shift+右键:选择“在此处打开命令窗口”

for %a in (*.*) do ren "%a" "prefix - %a"

如果文件很多,最好在此之前添加一个“@echo off”命令并在末尾添加一个“echo on”命令。

【讨论】:

次要挑剔:@echo on 中的 @ 不是必需的。你刚刚转了@echo off 选项 2(在添加缺少的 do 之后)不起作用 — 在某些文件被重命名后,for 在新名称下找到它们,一次又一次地添加前缀直到文件名长度已达到上限。 当使用选项 2 我得到ren was unexpected at this time. 知道为什么吗? @billgates 他的回答中缺少do 这个词。应该是for %a in (.) do ren "%a" "prefix - %a" @SergeyVlasov 这在两个选项中都会发生。避免这种情况的唯一方法是让重命名将其放在原始位置之上。或者在重命名后将其移动到不同的文件夹。【参考方案2】:

免费软件“Bulk Rename Utility”也运行良好(对于高级任务也很强大)。 Download 安装需要一分钟。

请参阅原始网站上的screenshots 和tutorial。

--

我无法提供分步截图,因为图片必须在Creative Commons License 下发布,并且我不拥有该软件的截图。

免责声明:我与上述软件/公司没有任何关系。我喜欢该产品用于我自己的任务,它满足 OP 和类似要求,因此推荐。

【讨论】:

我自己在某个时候开始使用它。 +1 用于向线程添加内容。 @ofer.sheffer 谢谢。 这个答案跑题了! -1 @MarcoDemaio 感谢您的反馈。 OP 想要完成一项任务,而链接的软件使其易于完成。我相信,解决方案的复杂性并不会使其更具相关性。 @GopalAggarwal:对不起,你是对的,我在他的问题“我想批量重命名文件夹中的文件”中读到,我以为他正在寻找 Windows 批处理文件。我删除了我的 -1。【参考方案3】:

这对我有用,首先 cd 在您要更改文件名的目录中,然后运行以下命令:

Get-ChildItem | rename-item -NewName  "house chores-" + $_.Name 

在线文档

Get-ChildItem Rename-Item

【讨论】:

这会导致无限循环,直到文件名达到 Windows 限制。而是使用@Dave.Gugg 的回复:***.com/a/37279979/2179408【参考方案4】:

这里的两个 Powershell 答案的问题在于,前缀可能最终会被复制,因为脚本可能会在文件重命名之前和之后在文件上运行,具体取决于重命名过程运行时使用的目录。要解决这个问题,只需使用-Exclude 选项:

Get-ChildItem -Exclude "house chores-*" | rename-item -NewName  "house chores-" + $_.Name 

这将防止进程多次重命名任何一个文件。

【讨论】:

请考虑在您的建议中添加一个不太具体的示例,其中包括 $_.Directory.Name【参考方案5】:

我知道这是一个老问题,但我从各种答案中学到了很多,但我想出了我自己的解决方案作为一个函数。这应该动态地将父文件夹作为前缀添加到与特定模式匹配的所有文件中,但前提是它还没有该前缀。

function Add-DirectoryPrefix($pattern) 
    # To debug, replace the Rename-Item with Select-Object
    Get-ChildItem -Path .\* -Filter $pattern -Recurse | 
        Where-Object $_.Name -notlike ($_.Directory.Name + '*') | 
        Rename-Item -NewName $_.Directory.Name + '-' + $_.Name
        # Select-Object -Property Directory,Name,@Name = 'NewName'; Expression= $_.Directory.Name + '-' + $_.Name

https://gist.github.com/kmpm/4f94e46e569ae0a4e688581231fa9e00

【讨论】:

【参考方案6】:

根据@ofer.sheffer 的回答,此命令将批量重命名并将当前日期添加到文件名中。即“file.txt”对于当前文件夹中的所有文件变成“20180329 - file.txt”

for %a in (*.*) do ren "%a" "%date:~-4,4%%date:~-7,2%%date:~-10,2% - %a"

【讨论】:

【参考方案7】:

我正在撕扯头发,因为对于某些项目,重命名的项目会再次重命名(重复,除非达到最大文件名长度)。 Get-ChildItem 和管道输出 dir 都发生了这种情况。我猜重命名的文件是由于字母顺序的变化而被拾取的。我通过以下方式解决了这个问题:

Get-ChildItem -Path . -OutVariable dirs
foreach ($i in $dirs)  Rename-Item $i.name ("<MY_PREFIX>"+$i.name) 

这会将 Get-ChildItem 返回的结果“锁定”在变量 $dirs 中,您可以对其进行迭代,而不必担心顺序会改变或发生其他有趣的事情。

Dave.Gugg 关于使用 -Exclude 的提示也应该可以解决这个问题,但这是一种不同的方法;也许如果被重命名的文件已经包含前缀中使用的模式。

(免责声明:我非常喜欢 PowerShell n00b。)

【讨论】:

【参考方案8】:

基于@ofer.sheffer 的回答,这是用于添加词缀的 CMD 变体(这不是问题,但如果您搜索词缀,此页面仍然是排名第一的 google 结果)。由于扩展名,它有点不同。

for %a in (*.*) do ren "%~a" "%~na-affix%~xa"

您可以更改“-affix”部分。

【讨论】:

以上是关于重命名文件夹中的多个文件,添加前缀 (Windows)的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 7 中使用 REN 批量重命名文件(添加前缀)

文件重命名时快速添加时间前缀

重命名文件和目录(添加前缀)

在 Unix 中根据模式重命名多个文件

在单个命令中使用前缀重命名文件夹中的所有文件

如何批量在多个文件前面添加名称或者数字?