如何在Windows中重命名一堆目录?


2

我想从中更改目录名称

view_pictures
personal_pictures
scenic_pictures

2017_view_pictures
2017_personal_pictures
2017_scenic_pictures

每个文件夹里面都有文件,这只是一个虚构的例子,在源目录中有超过20K的子目录,因此手动重命名是不可能的。
我尝试使用tree命令获取列表,
因此我可以使用notepad ++和一些正则表达式操作列表,
但是树不会给出完整路径,所以我可以生成命令。

这是目录结构:

root path
    picsfromA
        view_pictures
        personal_pictures
    picsfromB
        view_pictures
        personal_pictures
        scenic_pictures
    picsfromC
        personal_pictures
        scenic_pictures
    picsfromD
        personal_pictures
    picsfromN
        scenic_pictures

这是所需的目录结构:

root path
    picsfromA
        2017_view_pictures
        2017_personal_pictures
    picsfromB
        2017_view_pictures
        2017_personal_pictures
        2017_scenic_pictures
    picsfromC
        2017_personal_pictures
        2017_scenic_pictures
    picsfromD
        2017_personal_pictures
    picsfromN
        2017_scenic_pictures

更新
我也尝试这样:
困难的部分是打破路径字符串并重建它。

@echo off
SETLOCAL
set folder_path=%%f
for /D /r %%f in (*) do (
    set folder_path=%%f
    echo %folder_path%

    if "%folder_path:~-13%" EQU "view_pictures" (
      REM path without last folder name
      REM construct path without folder name
      REM [ren old folder] , [new folder.]
    )

  )

1
你应该看看Bulk Rename Utility - - bulkrenameutility.co.uk/Main_Intro.php
Anaksunaman

1
如果你有WSL om你的Windows 10(如果有的话)会更容易。
iBug

1
@iBug如果你不知道批量但是bash会更容易;-)
LotPings 2017年

1
我真的很喜欢RegexRenamer
Cole Johnson

Answers:


1

这是一个使用FOR / D / R的工作解决方案

@echo off
for /d /r %%F in (*) do (
  if /i "%%~nxF" == "view_pictures" ren "%%F" "2017_%%~nxF"
  if /i "%%~nxF" == "personal_pictures" ren "%%F" "2017_%%~nxF"
  if /i "%%~nxF" == "scenic_pictures" ren "%%F" "2017_%%~nxF"
)

或者通过额外的循环简化

@echo off
for /d /r %%F in (*) do for %%A in (view personal scenic) do (
  if /i "%%~nxF" == "%%A_pictures" ren "%%F" "2017_%%~nxF"
)

或者您可以使用LotPings发布的FOR / F解决方案。

您还可以使用我的JREN.BAT正则表达式重命名实用程序。JREN是纯脚本(混合JScript /批处理),可以在任何Windows机器上从XP开始本地运行 - 不需要第三方exe文件。

jren "^" "2017_" /s /d /fm "scenic_pictures|personal_pictures|view_pictures"

救了我的一天,伟大,优雅的解决方案,谢谢!
648026年

1

for /D /r %%f in (*) do ( 是一个无效的组合,请使用echo查看输出。

  • 您可以堆叠两个for /D以首先迭代picsfrom..,然后子文件夹或
  • for /f使用正则表达式过滤($在端锚)解析DIR输出到匹配了FINDSTR只希望子文件夹:

@Echo off
Set "Folders=view_pictures$ personal_pictures$ scenic_pictures$"

For /f "delims=" %%F in (
     'Dir /B/S/AD ^|Findstr /I "%Folders%"'
) Do Ren "%%~fF" "2017_%%~nxF"

我的ramdrive上的示例树A:

> tree
A:\
└───root path
    ├───picsfromA
    │   ├───2017_personal_pictures
    │   └───2017_view_pictures
    ├───picsfromB
    │   ├───2017_personal_pictures
    │   ├───2017_scenic_pictures
    │   └───2017_view_pictures
    ├───picsfromC
    │   ├───2017_personal_pictures
    │   └───2017_scenic_pictures
    ├───picsfromD
    │   └───2017_personal_pictures
    └───picsfromN
        └───2017_scenic_pictures

编辑for /D /r %%A in (*) do Echo:%%A我系统上的输出

A:\root path\picsfromA
A:\root path\picsfromB
A:\root path\picsfromC
A:\root path\picsfromD
A:\root path\picsfromN
A:\root path\picsfromA\2017_personal_pictures:A:\root path\picsfromN
A:\root path\picsfromA\2017_view_pictures:A:\root path\picsfromN
A:\root path\picsfromB\2017_personal_pictures:A:\root path\picsfromN
A:\root path\picsfromB\2017_scenic_pictures:A:\root path\picsfromN
A:\root path\picsfromB\2017_view_pictures:A:\root path\picsfromN
A:\root path\picsfromC\2017_personal_pictures:A:\root path\picsfromN
A:\root path\picsfromC\2017_scenic_pictures:A:\root path\picsfromN
A:\root path\picsfromD\2017_personal_pictures:A:\root path\picsfromN
A:\root path\picsfromN\2017_scenic_pictures:A:\root path\picsfromN

你的FOR / F解决方案很好。但是没有任何问题FOR /D /R %%F in (*) DO ...。它工作得很好。
dbenham

@dbenham我得到两个pathes(完整路径和根路径)用冒号分隔,该命令用于子文件夹,所以它可能有效,但有意想不到的结果。
LotPings

我不明白你对FOR / R / D输出的描述。在我的机器上,我得到了根目录下每个子文件夹的完整路径的预期递归列表。我已成功使用该构造多年。
dbenham

@dbenham在我的回答中附加了命令的输出。
LotPings

到底是什么时髦啊!**%??? 我无法想象在您的机器上导致该结果的原因。我当然没见过类似的东西。我希望得到一个更好的理解。您可以将此问题作为主题发布在dostips.com/forum上。这是一个很好的协作来回调查的网站。
dbenham
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.