使用Robocopy递归复制指定文件并扁平化存储至目标目录的问题
Robocopy递归复制指定文件并扁平化存储至目标目录的问题
哥们,我完全懂你遇到的困扰——你想把C:\source整个目录树里所有的.DOC文件都捞出来,一股脑直接放到C:\destination目录下,不用保留原来那些子文件夹结构,但现在用的命令只扫了C:\source的根目录,没深入子文件夹对吧?
先说说你当前命令的问题:默认情况下,Robocopy只会处理源目录的直接文件和文件夹,不会自动递归子目录。所以要让它扫遍所有子文件夹,得先加递归参数,但直接加参数的话,它又会在目标目录重建源文件夹的结构,这不是你想要的效果。
给你两个可行的方案,都是用Robocopy实现的:
方案一:结合for循环实现扁平化复制(最符合需求)
这个方法会递归遍历所有子文件夹里的.DOC文件,然后逐个复制到目标根目录,完全不保留原结构:
如果是在命令提示符里直接执行,用这个命令:
for /r "C:\source" %f in (*.doc) do robocopy "%~dpf." "C:\destination" "%~nxf" /COPY:DAT /R:1 /W:1 /NJH /NJS
要是写在批处理文件里,记得把%改成%%:
@echo off for /r "C:\source" %%f in (*.doc) do robocopy "%%~dpf." "C:\destination" "%%~nxf" /COPY:DAT /R:1 /W:1 /NJH /NJS
我给你拆解下关键参数的作用:
for /r "C:\source" %f in (*.doc):递归遍历C:\source下所有后缀为.DOC的文件,每个文件的完整路径存在%f变量里%~dpf:提取当前文件所在的驱动器和目录路径,%~nxf提取文件名加扩展名,这样Robocopy就只会复制单个文件到目标目录/COPY:DAT:复制文件的核心属性(数据、文件属性、时间戳),如果需要复制权限等额外属性,可以改成/COPYALL/R:1 /W:1:遇到文件被占用时重试1次,间隔1秒,避免卡死/NJH /NJS:关闭作业头和总结输出,让命令行更干净
方案二:先递归复制再手动合并(适合临时操作)
如果你只是偶尔操作,不想写脚本,也可以先让Robocopy递归复制所有文件(带目录结构),再把目标目录里所有子文件夹的.DOC文件移动到根目录,最后删掉空文件夹:
- 先执行递归复制命令:
robocopy C:\source C:\destination *.doc /E /COPY:DAT /R:1 /W:1
这里的/E参数会让Robocopy遍历所有子文件夹(包括空文件夹),把所有.DOC文件连同原目录结构复制到目标。
- 然后用命令把所有子文件夹里的.DOC文件移到目标根目录:
for /r "C:\destination" %f in (*.doc) do move "%f" "C:\destination\"
- 最后删掉空的子文件夹:
for /d %d in ("C:\destination\*") do rd "%d"
不过这个方案有个小风险:如果不同子文件夹里有同名的.DOC文件,移动的时候会覆盖,所以要确保文件名都是唯一的,或者提前处理重名问题。
备注:内容来源于stack exchange,提问作者jeremy
相关产品推荐
相关产品推荐

