![Windows 命令行:如何复制给定根目录下的子目录而不是文件?](https://linux22.com/image/1352847/Windows%20%E5%91%BD%E4%BB%A4%E8%A1%8C%EF%BC%9A%E5%A6%82%E4%BD%95%E5%A4%8D%E5%88%B6%E7%BB%99%E5%AE%9A%E6%A0%B9%E7%9B%AE%E5%BD%95%E4%B8%8B%E7%9A%84%E5%AD%90%E7%9B%AE%E5%BD%95%E8%80%8C%E4%B8%8D%E6%98%AF%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我有一个像这样的文件层次结构:
RootDir
/A
/fileA.txt
/B
/C
/fileC.txt
/fileB.txt
/otherFile1.txt
/otherFile2.txt
我只想复制子目录(即A
)B
和他们之下的一切(意思是我希望复制除otherFile1.txt
和之外的所有内容otherFile2.txt
)。
根目录下有远多于 2 个目录和 2 个文件,所以我不想逐一指定名称。
有什么建议么?
答案1
cd SOURCE
for /F "delims=" %a in ('dir /B /AD') do @xcopy /E "%a" "DESTINATION\%a\"
怎么运行的:
一旦你进入来源目录,该命令逐行
dir /B /AD
列出所有目录 ( ) 。/AD
/B
for /F "delims=" %a in ('...') do
检查命令的输出...
,将变量设置%a
为下一行输出,然后执行后续内容do
。这里,
delims=
确保变量保存了整行的内容。如果没有它,则%a
只会保存到第一个空格为止的字符。xcopy /E "%a" "DESTINATION\%a\"
将当前指定的目录复制%a
到目录中同名的文件夹中目的地。该/E
开关会导致目录的内容也被复制。1指定目标中的目录名称至关重要。如果没有它,
fileA.txt
则会复制到DESTINATION\fileA.txt
(而不是DESTINATION\A\fileA.txt
)。尾部的反斜杠用于表示这
%a
是目录名,而不是文件名。双引号是必需的,以便正确处理包含空格的目录名。
如果要在批处理文件中使用此命令,则所有百分号都必须用第二个百分号进行转义,即%a
变成%%a
。
1 /E
也会复制空目录。如果不想这样做,可以使用/S
。
答案2
与 Dennis 和 David Ruhmann 的答案类似,但使用 FOR /D 循环而不是 FOR /F。
for /d %F in (rootFolderPath\*) do @xcopy /e /i "%F" "destinationPath\%~nxF"
答案3
我能想到的最好的方法是使用 Robocopy 的“/create”开关,它只复制整个文件夹结构,以及“仅 0 长度文件” - 我确信这会导致所有文件被排除
Robocopy /e /create \(文件夹 A 的源路径) \(目标路径)
Robocopy /e /create \(文件夹 B 的源路径) \(目标路径)
您还可以(如果它们都是相同的文件类型,或者是少数已知文件类型)使用“排除文件” “/ xf”开关并使用通配符排除文件类型,如下所示:
Robocopy /e (文件夹 A 的源路径) (目标路径) /xf *.txt
Robocopy /e (文件夹 B 的源路径) (目标路径) /xf *.txt
答案4
原生 Windows CMD 解决方案。仅从 RootDir 复制子文件夹(及其内容)。
for /f "delims=" %%A in ('dir RootDir /a:d /b') do xcopy %%A DestDir /e /i