Windows 命令行:如何复制给定根目录下的子目录而不是文件?

Windows 命令行:如何复制给定根目录下的子目录而不是文件?

我有一个像这样的文件层次结构:

RootDir
  /A
    /fileA.txt
  /B
    /C
       /fileC.txt
    /fileB.txt
  /otherFile1.txt
  /otherFile2.txt

我只想复制子目录(即AB他们之下的一切(意思是我希望复制除otherFile1.txt和之外的所有内容otherFile2.txt)。

根目录下有远多于 2 个目录和 2 个文件,所以我不想逐一指定名称。

有什么建议么?

答案1

您可以使用以下组合对于/f复制目录完成这个任务:

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

相关内容