我有一个包含一堆子文件夹和文件的文件夹,但结构效率有点低。例如:
根文件夹
---- EmptyFolder1
-------- Folder1中
------------ SubFolder1
------------文件1
------------文件2
---- EmptyFolder2
-------- FOLDER2
------------ SubFolder2
------------文件3
------------ File4
如何在树中移动所有文件夹/子文件夹/文件并删除所有EmptyFolders,使其看起来更像这样:
根文件夹
---- Folder1中
-------- SubFolder1
--------文件1
--------文件2
----文件夹2
-------- SubFolder2
--------文件3
-------- File4
答案 0 :(得分:1)
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir\t h r e e"
FOR /f "delims=" %%a IN (
'dir/s/b/a-d "%sourcedir%"'
) DO (
CALL :movefile %%a
)
:loop
SET "zapped="
FOR /d /r "%sourcedir%" %%a IN (.) DO (
RD "%%a" >NUL 2>NUL
IF NOT EXIST "%%a" SET zapped=Y
)
IF DEFINED zapped GOTO loop
DIR /s/b/ad "%sourcedir%
GOTO :EOF
:movefile
SET "oldfn=%*"
SET "newfn=!oldfn:%sourcedir%\=!"
SET "newfn=%sourcedir%\%newfn:*\=%"
FOR %%r IN ("%newfn%") DO (
ECHO MD "%%~dpr"
ECHO MOVE "%oldfn%" "%newfn%"
)
GOTO :eof
您需要更改sourcedir
的设置以适合您的具体情况。
警告首先测试代表性子树!
所需的MD命令仅用于ECHO
用于测试目的。 在您确认命令正确无法后,将ECHO(MD
更改为MD
以实际创建目录。附加2>nul
以禁止错误消息(例如,当目录已存在时)
为了测试目的,所需的MOVE命令仅为ECHO
。 在您确认命令正确后,将ECHO(MOVE
更改为MOVE
以实际移动文件。附加>nul
以取消报告消息(例如1 file moved
)
:loop
标签后面的部分删除子树中的所有空目录。必要时,命令执行不仅仅显示。
对包含对cmd
具有特殊含义的符号的文件/目录名非常非常小心。