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

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

我想将目录名称从

view_pictures
personal_pictures
scenic_pictures

2017_view_pictures
2017_personal_pictures
2017_scenic_pictures

每个文件夹内都有文件,这只是一个虚构的例子,源目录中有超过 20K 个子目录,因此无法手动重命名。
我尝试使用命令,
这样我就可以使用 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

这是一个使用 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/batch),可在 XP 及更高版本的任何 Windows 机器上本地运行 - 无需第三方 exe 文件。

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

答案2

for /D /r %%f in (*) do (是无效的组合,请通过回显查看输出。

  • 你可以堆叠两个for /D来首先迭代picsfrom..然后迭代子文件夹或
  • for /f使用正则表达式(末尾有锚点)过滤解析目录输出,以便仅使用 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"

我的 RAM 驱动器 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

相关内容