我有大量文件(45,000+),資料夾結構相當複雜。我提取了約 13,000 個檔案的子集及其路徑(相對於根資料夾),我想將其與原始資料夾路徑一起複製。
儘管我進行了徹底的搜索,但我找不到一種方法,使用 xcopy 或 robocopy 來完成我想要的操作。我可以輕鬆地為清單中的每個條目建立一個批次文件,並使用複製命令。但是,我找不到任何 x/robocopy 開關或開關組合來從我的來源檔案產生目標中的資料夾路徑,例如:
xcopy dir1\dir2\dir3\file.txt copy_folder /<some switches>
或者
xcopy dir1\dir2\dir3\file.txt copy_folder\dir1\dir2\dir3\file.txt /<some switches>
dir1\dir2\dir3
如果該資料夾下不存在該路徑,我希望它會建立該路徑copy_folder
並在其中放置副本file.txt
。據我了解,在 Linux 上cp --parent
正是這樣做的。
任何關於實現這一目標的最佳方法的建議都是非常受歡迎的!
答案1
如果資料夾不存在,XCOPY 將建立這些資料夾,但它首先提示詢問目標是檔案還是目錄。
因此,您可以透過管道將 F 回應傳遞給 XCOPY 命令,以便該命令不會暫停。
for /f "delims=" %%F in (yourList.txt) do echo f 2>nul | xcopy /y "%%~F" "copyFolder\%%~F"
如果清單中有重複項,則使用該/Y
選項 - 您不希望 XCOPY 命令提示詢問是否要覆寫。
如果路徑確實存在,則需要將 stderr 重定向到 nul,在這種情況下,右側可能會在左側之前完成,導致左側將以下錯誤訊息列印到 stderr -The process tried to write to a nonexistent pipe.
重定向隱藏了不需要的錯誤訊息。
另一種選擇是在執行 XCOPY 之前先建立目標路徑。只需將 stderr 重定向到 null 即可避免在路徑已存在時看到錯誤訊息。
for /f "delims=" %%F in (yourList.txt) do (
md "copyFolder%%~pF" 2>nul
xcopy /y "%%~F" "copyFolder\%%~F"
)
"copyFolder%%~pnxF"
無論使用哪種解決方案,如果清單中的路徑包含磁碟機號,那麼您將需要使用"copyFolder\%%~F"
.請注意,~p
修飾符包括前導\
.