在 Windows 中将多个文件的前缀重命名或删除为每个文件的编号

Posted

技术标签:

【中文标题】在 Windows 中将多个文件的前缀重命名或删除为每个文件的编号【英文标题】:Rename or remove prefix for multiple files to each ones' number in Windows 【发布时间】:2012-04-29 11:02:42 【问题描述】:

我正在尝试更改当前文件夹中的所有文件名,我试图通过删除文件前缀(每个文件都有一个公共前缀)或将它们的名称更改为它们的数量(如果有 5 个文件)来实现这一点, 文件名将是 1.txt 2.txt 3.txt 4.txt 5.txt)。

现在我在cmd中找到了ren命令并玩了一下,但到目前为止我无法达到结果,我只能在cmd中运行它,所以不能使用批处理文件。

这是我得到的最接近的,但它只添加了一个前缀:

FOR %f IN (*.*) DO ren %f prefix%f

我尝试过相反的做法:

FOR %f IN (*.*) DO ren prefix%f %f

但是,当然,没有工作,所以我现在寻求帮助和一些解释,如果可能的话(我想了解这些事情是如何工作的)。提前感谢您的帮助。

【问题讨论】:

这些命令似乎甚至不适用于非常大的目录。它不断向已添加前缀的文件添加前缀。 【参考方案1】:

https://superuser.com/a/871799/497147

提供了一个更简单的解决方案

我把它复制在这里以便于访问。

忘记复杂的脚本。

rename 是一个非常古老且从未正确完成的命令。如果你没有正确使用它,结果可能会让你大吃一惊。

例如,从abcd1.txtabcd2.txtabcd3.txt 等中删除前缀abcd 以获得1.txt2.txt3.txt 只需使用

rename "abcd*.txt" "////*.txt"

/ 的数量需要与要删除的初始字符数量相同。

请为两个参数加上双引号。

【讨论】:

今天的救星。 非常酷和奇怪的技术。我已经用这些信息更新了我的How does the Windows RENAME command interpret wildcards? SuperUser Q&A,尽管从技术上讲,/ 不能用作通配符。 难以置信的简单和完美的工作。请注意,“/”的数量与匹配表达式中指定的字符数无关。另一个例子:rename "IM*.*" "////*.*" 匹配 2 个字符的前缀并删除 4 个字符 我用它来删除WhatsApp图像的IMG-前缀:rename "IMG-*.*" "////*.*"【参考方案2】:

我不明白你为什么不能使用批处理文件。但这是一个适用于大多数文件名的解决方案。

关键 - 首先你必须确保你有一个未定义的变量名,我将使用 fname

set "fname="

接下来是实际执行重命名的命令。如果 fname 已经定义,它将无法正常工作。

for %a in (prefix*.txt) do @(set "fname=%a" & call ren "%fname%" "%fname:*prefix=%")

为每次迭代定义 fname 变量,然后语法 %fname:*prefix=% 将第一次出现的“前缀”替换为空。棘手的是 Windows 在第一次解析命令时首先尝试扩展 %fname%。当然这行不通,因为它还没有被定义。如果未找到变量,则在命令行上保留百分比。 CALL 会导致一个额外的扩展阶段发生在变量设置之后,因此扩展工作。

如果在运行命令之前定义了 fname,那么它只会尝试为每次迭代重命名同一个文件,而不是在循环中分配的值。

如果要使用不同的前缀再次运行命令,则必须先再次清除定义。

EDIT - 这是一个名为“RemovePrefix.bat”的批处理文件

::RemovePrefix.bat  prefix  fileMask
@echo off
setlocal
for %%A in ("%~1%~2") do (
  set "fname=%%~A"
  call ren "%%fname%%" "%%fname:*%~1=%%"
)

假设您有名为 "prefixName.txt" 的文件,那么您将通过执行来使用该脚本

RemovePrefix  "prefix"  "*.txt"

批处理文件将重命名您当前目录中的文件。除非批处理文件存在于 PATH 变量中的目录中,否则批处理文件也必须位于当前目录中。或者您可以在调用时指定批处理文件的完整路径。

批处理文件的扩展规则不同。 FOR 变量必须被引用为 %%A 而不是 %A,并且 %%fname%% 最初不扩展,而是将双百分号转换为单百分号,然后在 CALL 后扩展 %fname%。批处理文件是否已经定义了 fname 并不重要。 SETLOCAL 使 fname 的定义临时(本地)到批处理文件。

【讨论】:

完美,也非常感谢您的额外解释!编辑:作为一个额外的请求,如果可以在批处理文件中制作,您能否发布一个示例? 我不知道它是如何完美的 - 有一个令人讨厌的错误,其中 %f 与 %fname% 中的 %f 混淆了。现在全部修复:) 我必须在此脚本中进行哪些修改,以便它在当前目录的每个子目录中搜索 ".txt" 并删除给定的 prefix 相信你只需要在 FOR 语句中添加 /R 选项【参考方案3】:

以下是用rename为所有文件修剪前缀的直接方法

rename -d your_prefix *

【讨论】:

以上是关于在 Windows 中将多个文件的前缀重命名或删除为每个文件的编号的主要内容,如果未能解决你的问题,请参考以下文章

在Windows中重命名多个文件

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

如何以照片的拍摄时间批量重命名文件

如何从bash中的多个文件名中删除公共前缀模式[重复]

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

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