我可以使用哪个命令在Windows中递归重命名或移动文件?


Answers:


56

使用XP的for命令。例如,从命令行(在批处理文件中使用%%x)进行递归移动,请执行以下操作:

for /r %x in (foo) do move "%x" "drive:\path\bar"

要进行递归重命名,请执行以下操作:

for /r %x in (*.c) do ren "%x" *.cpp

批处理示例:

for /r "< DIR >" %%x in (*.c) do ren "%%x" *.cpp

这是迄今为止最简单的解决方案,非常感谢!
javamonkey79

要在批处理程序中使用FOR命令,请指定%%变量而不是%variable。
汤姆·罗宾逊

您如何在不进行cwd'ing的情况下将其执行到其他源目录?
埃文·卡罗尔

我试图用它用普通的''替换每个文件中的每个'%20'文件。我该怎么做呢?
迈克·沃伦

@RobKam,我实际上进入了for循环工作,但只重命名了1个文件。如何设置通配符以识别多个文件扩展名*.*
DJ KRAZE

3

robocopy "C:\Source Folder" "C:\Destination Folder" /E /COPYALL /XJ


Description of parameters:
/E - copy subdirectories, including Empty ones (/S to exclude empty ones)
/COPYALL - COPY ALL file info (equivalent to /COPY:DATSOU)
/XJ - eXclude Junction points and symbolic links. (normally included by default).

2

我只是使用move命令在Windows XP SP2框中运行了一个小示例,它可以工作。所有文件和目录都从源移动到了目的地。source和dest是目录名。

移动源目标
版本

Microsoft Windows XP [版本5.1.2600]
移动/?

移动文件并重命名文件和目录。

要移动一个或多个文件:
移动[/ Y | / -Y] [驱动器:] [路径] filename1 [,...]目标

重命名目录:
移动[/ Y | / -Y] [驱动器:] [路径] dirname1 dirname2

  [drive:] [path] filename1指定文件的位置和名称
                          或您要移动的文件。
  destination指定文件的新位置。目的地
                          可以包含驱动器号和冒号,
                          目录名称,或其组合。如果你要搬家
                          仅一个文件,如果还可以包含文件名
                          您要在移动文件时重命名文件。
  [drive:] [path] dirname1指定要重命名的目录。
  dirname2指定目录的新名称。

  / Y禁止提示您确认要
                          覆盖现有的目标文件。
  / -Y提示您确认要覆盖
                          现有的目标文件。

开关/ Y可能存在于COPYCMD环境变量中。
在命令行上可以使用/ -Y覆盖它。默认为
提示覆盖,除非正在执行MOVE命令
在批处理脚本中。

我真的在寻找递归重命名,抱歉,我将此举作为问题的一部分。
javamonkey79

1

内置的XCOPY命令关闭。它将执行递归复制,但我认为它不支持重命名。


1
不要忘记xcopy默认会忽略隐藏文件。
理查德·哈里森

1
for /r %%x in (%1) do ren "%%x" %2

这将递归重命名文件:-)

保存在文件中,给扩展名和扩展名两个参数。

例如:文件名为test.bat命令:test * .avi * .bmp

它将所有扩展名为avi的文件重命名为bmp(在所有子文件夹中:)

注意:这是10月26日13:20回答的问题。他放弃了

/r %x in (*.c) do ren "%x" *.cpp

当它颤抖的地方是%%而不是


仅批处理文件需要%%。
paradroid



1

我创建了一个VB脚本,该脚本可以搜索并替换目录名称...我也有文件版本,但是,我认为这足以让您开始使用自己的脚本。我使用此脚本的方式是使用fileandreplacedirs.vbs,并将其与要重命名的文件夹放在同一文件夹中。另外,它不一定要递归到文件夹中,但可以稍作修改

search1  = InputBox("Search for...", "", "")
replace1 = InputBox("replace with...", "", "")

Dim MyFile
MyFiles = GetFileArray(".")

For Each MyFile In MyFiles
    NewFilename = Replace(MyFile.Name, search1, replace1)
    If InStr( MyFile.Name, search1 ) Then MyFile.Name = NewFilename
Next

MsgBox "Done..."

function GetFileArray(ByVal vPath)
    'Get our objects...
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set Folder = FSO.Getfolder(vPath)
    Set Files = Folder.SubFolders

    'Resize the local array
    'Arrays are 0 based but Files collection is 1 based.
    if Files.count = 0 then
        GetFileArray = array()
        Exit Function
    Else
        Index = 0
        Redim FileList(Files.Count-1)
        For Each File In Files
            set FileList(Index) = File
            Index = Index + 1
        Next
        GetFileArray = FileList
    End If

    'Always good practice to explicitly release objects...
    Set FSO = Nothing
    Set Folder = Nothing
    Set Files = Nothing

End function

0

使用一个简单的DOS命令。

  1. cd到要递归重命名文件扩展名的源目录。

  2. 输入以下命令:

    ren *.[CurrentFileExtension] *.[DesiredFileExtension]
    

1
这对cwd很好,但对子目录却没问题,因此它不是递归的。虽然谢谢你:)
javamonkey79

0

if exist当文件在每个文件夹中都不存在时,我为了避免错误返回(在Jenkins中很重要,因此它不会破坏构建):

for /r %x in (foo) do if exist "%x" move "%x" "drive:\path\bar"

要进行递归重命名,请执行以下操作:

for /r %x in (*.c) do if exist "%x" ren "%x" *.cpp

批处理示例:

for /r "< DIR >" %%x in (*.c) do if exist "%%x" ren "%%x" *.cpp

1
不必创建新答案,您实际上应该只编辑添加到的答案。
LostBalloon

0

Powershell是您的朋友。不需要批处理文件或脚本。例如,要将一个远程目录中的所有.tiff文件递归重命名为.tif,可以从Powershell运行以下命令:

get-childitem "\\\servername\d$\path" -recurse -Include *.tiff | Rename-Item -NewName { $_.Name.replace(".tiff",".tif") }


0

我发现这个python脚本也可以正常工作:

for root, dirs, files in os.walk(cur_dir):  
    for filename in files:  
        file_ext = os.path.splitext(filename)[1]  
        if old_ext == file_ext:  
            oldname = os.path.join(root, filename)  
            newname = oldname.replace(old_ext, new_ext)  
            os.rename(oldname, newname)

可以在以下网址找到:http : //gomputor.wordpress.com/2008/09/29/change-the-extension-of-multiple-files-in-a-chosen-directory-with-python/

我将Python添加到路径中,并将Python脚本放在“ utils”文件夹中。然后,我创建了一个简单的批处理脚本来运行它:rn.bat:

python \utils\rn.py %1 %2 %3

我还更新了上面的python脚本,以从命令行获取其args。rn.py:

import sys
import os

cur_dir = sys.argv[1]
old_ext = sys.argv[2]
new_ext = sys.argv[3]

#print cur_dir, old_ext, new_ext
for root, dirs, files in os.walk(cur_dir):  
    for filename in files:  
        file_ext = os.path.splitext(filename)[1]

        if old_ext == file_ext:  
            oldname = os.path.join(root, filename)  
            newname = oldname.replace(old_ext, new_ext)  
            os.rename(oldname, newname)

最后,现在所有需要做的是这样的:

>rn . .foo .bar

要么

>rn \ .exe .txt

玩第二个吧:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.