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

Tom*_*son 19 windows cmd batch-file

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

C:\Source
Run Code Online (Sandbox Code Playgroud)

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

C:\Destination
Run Code Online (Sandbox Code Playgroud)

要求:

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

尝试0

XCOPY /E "C:\Source" "C:\Destination"
Run Code Online (Sandbox Code Playgroud)

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

尝试1

MOVE "C:\Source" "C:\Destination"
Run Code Online (Sandbox Code Playgroud)

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

C:\Destination\Source
Run Code Online (Sandbox Code Playgroud)

尝试2

这个问题和接受的答案的帮助下,我提出了:

for /r "C:\Source" %%x in (*) do move "%%x" "C:\Destination"
Run Code Online (Sandbox Code Playgroud)

这会移动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.
Run Code Online (Sandbox Code Playgroud)

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

RENAME "C:\Source" "C:\MyOtherDirectory\Destination"
RENAME "C:\Source" "MyOtherDirectory\Destination"
Run Code Online (Sandbox Code Playgroud)

Dav*_*ams 27

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

robocopy /move /e sourcedir destdir
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这是一个很好的答案,但实际上它先复制然后删除。如果要移动大型目录结构,这将需要一段时间。尽管仅在浏览器中手动移动它几乎是瞬间的,因为它要做的只是更新MFT。 (3认同)

ljs*_*ljs 11

更新:

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

在脚本的末尾,完全删除源文件夹以消除这些文件夹,这些文件夹已将文件移动到目标位置已存在的文件夹(这意味着这些文件夹已清空但未在源处删除).

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

唷!请告诉我你是如何继续这样做的!我测试了这个,它似乎运作良好.

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  
Run Code Online (Sandbox Code Playgroud)

  • `%%~ni` 删除扩展名,因此带点的文件夹名称会中断 - 更改为 `%%~nxi`。 (2认同)