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

我有一个目录,其中包含文件和一些级别的子目录:

C:\Source 

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

 C:\Destination 

要求:

  • 必须移动C:\ SourceData中的所有文件和所有子目录
  • 我将在batch file中运行该命令
  • 我无法使用Powershell或任何其他脚本语言

尝试0

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

这完美的作品,但它复制而不是移动。 我无法复制,然后删除源文件,因为我正在移动一大堆文件,而且没有足够的磁盘空间来同时拥有它们的两个副本。

尝试1

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

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

 C:\Destination\Source 

尝试2

在这个问题和接受的答案的一些帮助下,我想出了:

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

这将移动C:\ Source中的文件,但不移动子目录或其内容。 请注意,我使用%% x而不是%x,因为我在batch file中使用它。

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

尝试3

正如Nick D所build议的,我尝试重新命名:

重命名“C:\ Source”目标

对于示例场景,我给这个工作正常。 不幸的是,我真正的目的地目录与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. 

我得到“命令的语法不正确。” 错误,如果我尝试指定一个更复杂的目标path,例如:

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

更新

调整后的代码到一个。 检查目标文件夹是否已经存在,在这种情况下,移动该文件夹中的文件(并继续遍历源目录结构),否则移动批量文件夹。

在脚本结尾处,源文件夹将被完全删除,以消除已将其文件移到目标文件夹中已存在的文件夹(意味着这些文件夹已被清空但未被删除的文件夹)的文件夹。

另外,我们检查一个文件夹是否都是空的,并且已经存在于目的地,在这种情况下,我们什么也不做(把源文件夹留在脚本的最后一行)。 不这样做会导致“文件名,目录名称或卷标语法不正确”。 错误。

唷! 请让我知道你如何继续下去! 我已经测试了这个,它似乎运作良好。

 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 /yc:\source\*.* c:\destination rd /s /qc:\source 

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

 robocopy /move /e sourcedir destdir 

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

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

由于XCOPY的工作,你可以使用XCOPY和DELETE,这是一个解决方法,但应该工作?

在Vista上使用

 robocopy源目标/ MIR

 / MIR ..镜像一个完整的目录树(也删除目标文件)

其他

 XCOPY

当然你必须删除源码:)

我有一个目录,其中包含文件和一些级别的子目录:

C:\源

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

C:\目的地

也许我错过了一些东西,但不能只是重命名文件夹?

在Twitter上发送:尝试将尝试3与尝试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 

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

有些人建议只复制+删除源文件,但移动文件是不一样的复制+删除!

使用(x)复制功能时,可以在硬盘上的同一卷分配新空间 。 复制文件后, 文件(文件所需的旧分配空间)被标记为删除 。 虽然您将获得与最终用户相同的结果,但移动会产生不同的效果。

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

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

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

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

KISS 😉

编辑 :这似乎不工作,所以我的建议是垃圾了蹩脚的DOS命令行和Cygwin与BASH作为壳! (或者只是将cygwin二进制文件添加到路径中,这样你就可以在DOS中使用mv ,因此不需要根据需求状态更改shell)。

如果你所要做的只是将一个目录和内容上移一层:

 MOVE folder_you_wan_to_move .. 

注意..指向下一个目录。

我使用了一个名为xxcopy的实用程序。 它可以移动文件,并有许多有用的选项,你可以像这样使用它:

 xxcopy C:\Source C:\Destination /E /RC 

选项:

  • / E复制一切,甚至空文件夹

  • / RC在每次成功复制后删除每个源文件

您可以从http://www.xxcopy.com/xcpydnld.htm下载免费的个人使用的xxcopy副本

针对ufukgun的回答:

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

/ s – 复制空目录和子目录。
/ e – 复制目录和子目录,包括空目录。 与/ S / E相同。 可能会被用来修改/ T。
/ i – 如果目标不存在并复制多个文件,则假定目标必须是目录。
/ y – 禁止提示以确认您要覆盖现有的目标文件。

正如另一个答案所述,使用xcopy可能不如本地移动命令那样有效,因为它只会改变文件系统中的指针。