如何将一个目录树的内容移动到另一个目录树中?

时间:2009-07-13 09:48:38

标签: windows batch-file cmd

我有一个包含文件和多个子目录级别的目录:

C:\Source

我想将C:\ Source的内容移动到:

C:\Destination

要求:

  • 所有文件和所有子目录 in C:\ SourceData必须移动
  • 我将在a中运行命令 批处理文件
  • 我不能使用Powershell或 任何其他脚本语言

尝试0

XCOPY /E "C:\Source" "C:\Destination"

这很有效,但它复制而不是移动。我无法复制然后删除源,因为我正在移动一个非常大的文件集,并且没有足够的磁盘空间一次有两个副本。

尝试1

MOVE "C:\Source" "C:\Destination"

这将整个C:\ Source目录移动到 C:\ Destination中,所以我最终得到:

C:\Destination\Source

尝试2

this question and accepted answer的帮助下,我提出了:

for /r "C:\Source" %%x in (*) do move "%%x" "C:\Destination"

这会移动C:\ Source中的文件,但不移动子目录或其内容。请注意,我在批处理文件中使用%% x而不是%x。

使用FOR似乎很有希望,但我不确定我是否使用了正确的语法?我错过了什么吗?

尝试3

根据Nick D的建议,我尝试重命名:

重命名“C:\来源”目的地

对于示例场景,我给这个工作正常。不幸的是,我真正的目的地目录与 Source 目录处于不同的级别,似乎不支持:

C:\>REN /?
Renames a file or files.

RENAME [drive:][path]filename1 filename2.
REN [drive:][path]filename1 filename2.

Note that you cannot specify a new drive or path for your destination file.

我得到“命令的语法不正确。”如果我尝试指定更复杂的目标路径,则会出现错误,例如:

RENAME "C:\Source" "C:\MyOtherDirectory\Destination"
RENAME "C:\Source" "MyOtherDirectory\Destination"

12 个答案:

答案 0 :(得分:25)

毫无疑问使用robocopy。它是一个简单但非常有用的工具。

robocopy /move /e sourcedir destdir

这将移动所有文件和文件夹,包括空文件,删除每个原始文件后移动它。

如果您没有安装robocopy,可以单独下载或作为Microsoft资源工具包的一部分下载。

答案 1 :(得分:11)

<强>更新

将调整后的代码改为a。检查文件夹是否已存在于目标位置,在这种情况下移动该文件夹中的文件(并继续遍历源目录结构),否则移动文件夹批发。

在脚本结束时,将完全删除源文件夹以消除这些文件夹,这些文件夹已将文件移动到目标位置已存在的文件夹(这意味着这些文件夹已清空但未在源文件夹中删除)。 / p>

此外,我们检查文件夹是否为空且在目的地是否已存在,在这种情况下我们什么都不做(并将源文件夹保留为删除到脚本的最后一行)。不执行此操作会导致“文件名,目录名称或卷标语法不正确”。错误。

唷!请告诉我你是如何继续这样做的!我已经对此进行了测试,似乎运行良好。

for /d /r "c:\source" %%i in (*) do if exist "c:\destination\%%~ni" (dir "%%i" | find "0 File(s)" > NUL & if errorlevel 1 move /y "%%i\*.*" "c:\destination\%%~ni") else (move /y "%%i" "c:\destination")
move /y c:\source\*.* c:\destination
rd /s /q c:\source  

答案 2 :(得分:1)

由于XCOPY有效,你可以使用XCOPY和DELETE,这是一种解决方法,但应该有用吗?

答案 3 :(得分:1)

在Vista上使用

robocopy source destination /MIR

/MIR .. mirror a complete directory tree (also deletes files in the destination)

否则

xcopy

当然你必须在之后删除源:)

答案 4 :(得分:1)

  

我有一个包含的目录   文件和多个级别   子目录:

     

C:\源

     

我想移动内容   C:\来源:

     

C:\目标

也许我错过了什么,但你不能只重命名文件夹吗?

答案 5 :(得分:1)

在推特上发送: 尝试将尝试3与尝试1结合使用。重命名以使目标文件夹正确,然后将“目的地”移动到正确的位置。

答案 6 :(得分:1)

@echo on
set SOURCE=C:\Source
set DESTINATION=C:\Destination

xcopy %SOURCE%\* %DESTINATION%\* /s /e /i /Y

PAUSE

我使用这样的批处理文件......

或只是致电:

xcopy C:\Source\* C:\Destination\* /s /e /i /Y

答案 7 :(得分:1)

也许有点偏离主题,但仍然有用:

有人建议只复制+删除源文件,但是 移动文件与复制+删除不同!

使用(x)副本功能时,您在硬盘上的相同卷分配新空间。复制文件后,文件(文件所需的旧分配空间)标记为已删除。虽然您将获得与最终用户相同的结果,但移动会做出不同且更有效的事情。

移动文件实际上只会更改 MFT (主文件表)中的某些记录。这些更改仅包含用户查找其文件的不同路径。物理上,文件仍保留在硬盘上的相同扇区中。

答案 8 :(得分:1)

回应ufukgun的回答:

xcopy C:\Source\* C:\Destination\* /s /e /i /Y

/ s - 复制目录和子目录,但空目录除外 / e - 复制目录和子目录,包括空目录。与/ S / E相同。可用于修改/ T. / i - 如果目标不存在并复制多个文件,则假定目标必须是目录 / y - 禁止提示您确认是否要覆盖现有目标文件。

如另一个答案中所述,使用xcopy可能不如仅更改文件系统中的指针的本机移动命令那样高效。

答案 9 :(得分:0)

如果您要做的只是将目录和内容移动到一个级别:

MOVE folder_you_wan_to_move ..

请注意..指的是下一个目录。

答案 10 :(得分:0)

我留下我根据ljs尝试编写的代码, 它像Windows一样移动目录树,用源中的文件覆盖目标中已存在的文件,并避免慢速复制和擦除方法,除非目标位于不同的驱动器中。

如果您的S.O不是英文,则必须在找到0个文件时使用Dir命令使用的文本更改第6行。

movedir.bat source_dir destination_dir

@echo off
SETLOCAL  ENABLEDELAYEDEXPANSION

if %1.==. echo movedir dir1[\*] dir2 & echo move dir1 inside dir2 overwriting coincident files & echo option \* moves only dir1 content & goto end

set S=%~f1
set D=%~f2
set "noFiles= 0 File"
set "R=0"         rem R is option [\*] flag

if %S:~-2%.==\.. set "S=%S:~,-2%" & set "R=1"

if not exist "%S%" goto paramERR
if not exist "%D%" goto paramERR

set "Trim=0" & set "Sc=%S%"
:LP
set /A Trim+=1 & (set "Sc=!Sc:~1!") & if NOT !Sc!.==. goto LP

if %R%==0 (if exist "%D%\%~n1%~x1" (set "D=%D%\%~n1%~x1")) else move /y "%S%" "%D%" & goto end

CALL:movefiles "%S%" "%D%"
for /D /R "%S%" %%I in (*) do (set "Way=%%~fI") & (set "Way=!Way:~%Trim%!") & if exist "%D%!Way!" (CALL:movefiles "%%I" "%D%!Way!") else (move /y "%%I" "%D%!Way!\.." > NUL)
rd /s/q "%S%" & if %R%==1 md "%S%"
goto end

:movefiles 
dir %1 | find "%noFiles%" > NUL & if ERRORLEVEL 1 move /y "%~1\*.*" %2 > NUL 
goto :eof

:paramERR
echo Source or Destination does not exist
:end

答案 11 :(得分:-1)

我认为你能做的最简单的事就是修改你的尝试2

MOVE "C:\Source" "C:\Destination"

MOVE "C:\Source\*" "C:\Destination"

KISS; - )

编辑:这似乎不起作用,所以我的建议是删除糟糕的DOS命令行,并使用Cygwin和BASH作为shell! (或者只是将cygwin二进制文件添加到路径中,这样就可以在DOS中使用mv,因此无需根据需求状态更改shell。)