Windows 命令列:如何在給定的根目錄下複製子目錄而不是檔案?

Windows 命令列:如何在給定的根目錄下複製子目錄而不是檔案?

我有一個像這樣的文件層次結構:

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

我只想複製子目錄(即A, B)和他們之下的一切(這意味著我希望複製除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

相關內容