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

Другие вопросы по тегам