将多个文件重命名(或删除前缀)到每个号码

时间:2012-04-18 03:53:59

标签: windows cmd renaming

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

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

3 个答案:

答案 0 :(得分:29)

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

严重 - 首先你必须确保你有一个未定义的变量名,我将使用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=%%"
)

假设您有名为"prefixName.txt"的文件,那么您将通过执行

来使用该脚本
RemovePrefix  "prefix"  "*.txt"

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

批处理文件中的扩展规则不同。 FOR变量必须引用为%% A而不是%A,并且%% fname %%最初不会展开,而是将双倍百分比转换为单个百分比,然后在CALL之后展开%fname%。如果已经使用批处理文件定义了fname,则无关紧要。 SETLOCAL将fname的临时(本地)定义为批处理文件。

答案 1 :(得分:28)

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

我将其复制到此处以便于访问。

  

忘记复杂的脚本。

     

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

     

例如,要从abcdabcd1.txtabcd2.txt等删除前缀abcd3.txt,以获取1.txt2.txt3.txt只需使用

即可
rename "abcd*.txt" "////*.txt"
     

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

     

请为两个参数设置双引号。

答案 2 :(得分:0)

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

rename -d your_prefix *