重命名一个目录中至少五个级别的子目录?

Posted

技术标签:

【中文标题】重命名一个目录中至少五个级别的子目录?【英文标题】:Rename at least five levels of subdirectories within a directory? 【发布时间】:2020-08-26 02:17:31 【问题描述】:

我有以下输入路径:C:\Temp\01 - one\02 - two\03 - three\04 - four\05 - five,我希望将其重命名为C:\Temp\01 one\02 two\03 three\04 four\05 five

以下批次重命名2 级别,但我希望至少重命名5 级别:

@echo off
setlocal enabledelayedexpansion
pushd "C:\Temp"

for /d %%z in (*) do (
  pushd "%%z"
     for /d %%a in (*) do (
         set "folder=%%a"
         ren "%%a" "!folder:-=!"
     )
  popd
)    
for /d %%a in (*) do (
     set "folder=%%a"
     ren "%%a" "!folder:-=!"
)
popd

【问题讨论】:

你应该能够意识到,如果你在每个分支上操作,只要你重命名了父结构的一部分,分支就不再存在,以便下一个变化。防止这种情况发生的最有效方法是首先以某种方式确定最深层次,然后从那里向后工作。然而,这不是一个简单的过程,它不可避免地需要在执行之前对树结构进行存储和排序,(存储到内存,如果树不是太大,或者存储到磁盘)任何重命名。 【参考方案1】:

这样的递归文件夹重命名可以使用一个子程序来完成,该子程序会根据需要递归调用自身,这意味着在这种情况下,只要找到两个空格之间带有连字符的子文件夹,就会调用自身。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "eol=| delims=" %%I in ('dir "* - *" /AD /B 2^>nul') do call :RenameFolder "%%~fI"
exit /B

:RenameFolder
for /F "eol=| delims=" %%I in ('dir "%~1\* - *" /AD /B 2^>nul') do call :RenameFolder "%~1\%%I"
set "NewFolderName=%~nx1"
set "NewFolderName=%NewFolderName:-=%"
ren %1 "%NewFolderName%"
goto :EOF

这里的重要技巧是每个 FOR 循环处理内存中捕获的文件夹名称列表,并且不直接从文件系统处理与通配符模式匹配的文件夹名称作为文件夹名称匹配的列表每次重命名文件夹时,通配符模式都会发生变化。在处理文件夹名称列表时,结果将是不确定的,这些文件夹名称在每个文件夹重命名时都会发生变化。

此批处理文件忽略名称中不包含空格、连字符、空格的文件夹及其所有子文件夹,即使在名称中包含空格、连字符、空格的子文件夹上也是如此。出于这个原因,对于文件夹示例 C:\Temp\01 - one\02 - two\03 - three\04 - four\05 - five,它在运行批处理文件时尽可能高效,C:\Temp 是当前目录。


这是另一种解决方案,它处理当前目录中的所有目录及其所有子目录。目录名中包含空格、连字符、空格的所有子目录都被重命名了。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "eol=| delims=" %%I in ('dir /AD /B 2^>nul') do call :ProcessFolder "%%~fI"
exit /B

:ProcessFolder
for /F "eol=| delims=" %%I in ('dir "%~1\" /AD /B 2^>nul') do call :ProcessFolder "%~1\%%I"
set "NewFolderName=%~nx1"
set "NewFolderName=%NewFolderName: - =  %"
if not "%~nx1" == "%NewFolderName%" ren %1 "%NewFolderName%"
goto :EOF

这个批处理文件也适用于C:\Temp\ABCD Training company Ltd\500020 - Test\0500020011 - TestC:\Temp 是当前目录,尽管ABCD Training company Ltd 的名称中不包含空格、连字符和空格。


要了解所使用的命令及其工作原理,请打开command prompt 窗口,在那里执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

call /? dir /? echo /? exit /? for /? goto /? if /? ren /? set /? setlocal /?

另见Where does GOTO :EOF return to?

【讨论】:

以上是关于重命名一个目录中至少五个级别的子目录?的主要内容,如果未能解决你的问题,请参考以下文章

Git:重命名分支中的目录

如何批量识别图像中的文字并对图片进行识别的文字图片文件重命名,也可以识别后更改文件夹也支持多级目录

如何批量识别图像中的文字并对图片进行识别的文字图片文件重命名,也可以识别后更改文件夹也支持多级目录

批量重命名目录中的文件

如何批量重命名目录、子目录和文件?

DOS按规则批量重命名所有(子)目录下文件