在 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.txt
、abcd2.txt
、abcd3.txt
等中删除前缀abcd
以获得1.txt
、2.txt
、3.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 中将多个文件的前缀重命名或删除为每个文件的编号的主要内容,如果未能解决你的问题,请参考以下文章