Копировать файлы с полным относительным путем в Windows

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

Связанный контент