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