Копировать файлы с полным относительным путем в Windows
У меня есть большой набор файлов (более 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
там. Я так понимаю на линуксе 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
модификатор включает ведущие \
,