我有一个包含文件和多个子目录级别的目录:
C:\Source
我想将C:\ Source的内容移动到:
C:\Destination
要求:
尝试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"
答案 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。)