如何重命名多个文件夹同时保留其文件子目录

如何重命名多个文件夹同时保留其文件子目录

我想重命名多个文件夹并保持所有文件和子目录完好无损。Windows
批处理命令(例如xcopy和)move无法处理所有情况*

我设置了两列,分别表示旧路径和新路径。

OLD PATH            NEW PATH
C:\dir1\dir3\dir7   C:\a1\a2\a3      
C:\dir1\dir4\dir8   C:\b1\b2\b3      
C:\dir2\dir5\dir9   C:\c1\c2\c3      
...
C:\dir2\dir6\dir0   C:\d1\d2\d3      

困难:每行需要重命名多个文件夹;最后列出的文件夹dir7可以有多个子目录;文件时间戳不应修改


*xcopy无法移动,只能复制。如果没有足够的空间来复制和删除大数据,那就麻烦了。
move命令不会移动子目录,只会移动文件

答案1

最简单(直接)的批处理文件版本如下:

call :robo "C:\dir1\dir3\dir7"   "C:\a1\a2\a3"
call :robo "C:\dir1\dir4\dir8"   "C:\b1\b2\b3"
call :robo "C:\dir2\dir5\dir9"   "C:\c1\c2\c3"
echo etc...
call :robo "C:\dir2\dir6\dir0"   "C:\d1\d2\d3"
goto:eof

:robo
robocopy %1 %2 /MOVE /E
goto:eof

如果目录有空格,则需要用引号引起来。

要从文件中读取目录,你可以执行以下操作:

directories.txt

C:\dir1\dir3\dir7,C:\a1\a2\a3
C:\dir1\dir4\dir8,C:\b1\b2\b3
C:\dir2\dir5\dir9,C:\c1\c2\c3
C:\dir2\dir6\dir0,C:\d1\d2\d3

不需要引号,用逗号分隔。然后在批处理文件中:

FOR /F "tokens=1-2* delims=," %%A IN (directories.txt) DO (
  robocopy "%%A" "%%B" /MOVE /E
)

同样在这里...如果您想看看 robocopy 做了什么,请首先使用/L

如果您有这样的文件(用空格对齐第一列和第二列),则需要添加一些代码来从目录中删除前导和尾随空格:

再次directories.txt

C:\dir1\dir3\dir7\sada\asda ,  C:\a1\a2\a3
C:\dir1\dir4\dir8           ,  C:\b1\b2\b3
C:\dir2\dir5\dir9           ,  C:\c1\c2\c3
...
C:\dir2\dir6\dir0           , C:\d1\d2\d3

这是批处理文件:

@echo off
setlocal enabledelayedexpansion
FOR /F "tokens=1-2* delims=," %%A IN (directories.txt) DO (
  call :trim dir1 %%A
  call :trim dir2 %%B
  robocopy "!dir1!" "!dir2!" /MOVE /E
)
goto:eof

:trim
set trimmed=%2
for /f "tokens=* delims= " %%c in ("%trimmed%") do set trimmed=%%c
for /l %%c in (1,1,100) do if "!trimmed:~-1!"==" " set trimmed=!trimmed:~0,-1!
set "%~1=%trimmed%"
goto:eof

注意:没有进行错误检查来查看目录是否真的存在或者是否只填充了一列......等等......
(但当然可以添加)。

相关内容