28

我正在尝试更改当前文件夹中的所有文件名,我试图通过删除文件前缀(每个文件都有一个公共前缀)或将它们的名称更改为它们的计数(如果有 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

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

4

3 回答 3

52

https://superuser.com/a/871799/497147中提供了一个更简单的解决方案

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

忘记为此的复杂脚本。

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

例如,abcd要从abcd1.txt,abcd2.txtabcd3.txt中删除前缀以获得1.txt, 2.txt3.txt只需使用

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

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

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

于 2015-09-14T09:37:41.190 回答
41

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

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

set "fname="

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

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

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

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

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

编辑- 这是一个名为“RemovePrefix.bat”的批处理文件,它可以完成这项工作

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

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

RemovePrefix  "prefix"  "*.txt"

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

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

于 2012-04-18T04:26:22.810 回答
-2

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

rename -d your_prefix *
于 2020-04-15T15:09:52.750 回答