命令行在目录树中向上移动文件/文件夹

时间:2014-09-18 18:07:16

标签: windows command-line

我有一个包含一堆子文件夹和文件的文件夹,但结构效率有点低。例如:

根文件夹
---- EmptyFolder1
-------- Folder1中
------------ SubFolder1
------------文件1
------------文件2
---- EmptyFolder2
-------- FOLDER2
------------ SubFolder2
------------文件3
------------ File4

如何在树中移动所有文件夹/子文件夹/文件并删除所有EmptyFolders,使其看起来更像这样:

根文件夹
---- Folder1中
-------- SubFolder1
--------文件1
--------文件2
----文件夹2
-------- SubFolder2
--------文件3
-------- File4

1 个答案:

答案 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具有特殊含义的符号的文件/目录名非常非常小心。