Eu tenho um grande conjunto de arquivos (mais de 45.000) em uma estrutura de pastas bastante complexa. Extraí um subconjunto de aproximadamente 13.000 arquivos e seus caminhos (em relação à pasta raiz) que desejo copiar com o caminho da pasta original.
Embora eu tenha pesquisado exaustivamente, não consegui encontrar uma maneira, com xcopy ou robocopy, de fazer o que desejo. Eu poderia facilmente criar um arquivo em lote com um comando de cópia para cada entrada da minha lista. No entanto, não consegui encontrar nenhuma opção x/robocopy ou combinações de opções que gerarão o caminho da pasta no destino do meu arquivo de origem, por exemplo:
xcopy dir1\dir2\dir3\file.txt copy_folder /<some switches>
ou
xcopy dir1\dir2\dir3\file.txt copy_folder\dir1\dir2\dir3\file.txt /<some switches>
Eu gostaria que ele criasse o caminho dir1\dir2\dir3
se ele não existir na pasta copy_folder
e colocasse uma cópia file.txt
lá. Eu entendo que no Linux cp --parent
faz exatamente isso.
Qualquer sugestão sobre a melhor maneira de conseguir isso é bem-vinda!
Responder1
O XCOPY criará as pastas se elas não existirem, mas primeiro perguntará se o destino é um arquivo ou diretório.
Portanto, você pode canalizar a resposta F para o comando XCOPY para que o comando não seja pausado.
for /f "delims=" %%F in (yourList.txt) do echo f 2>nul | xcopy /y "%%~F" "copyFolder\%%~F"
A /Y
opção é usada caso você tenha duplicatas em sua lista - você não deseja que o comando XCOPY pergunte se deseja substituir.
O redirecionamento de stderr para nul é necessário caso o caminho exista, caso em que o lado direito pode ser concluído antes do esquerdo, fazendo com que o lado esquerdo imprima a seguinte mensagem de erro para stderr - The process tried to write to a nonexistent pipe.
O redirecionamento oculta a mensagem de erro indesejada.
Outra opção é primeiro criar o caminho de destino antes de fazer o XCOPY. Simplesmente redirecione stderr para null para evitar ver uma mensagem de erro se o caminho já existir.
for /f "delims=" %%F in (yourList.txt) do (
md "copyFolder%%~pF" 2>nul
xcopy /y "%%~F" "copyFolder\%%~F"
)
Com qualquer uma das soluções, se o caminho na sua lista incluir uma letra de unidade, você precisará usar
"copyFolder%%~pnxF"
em vez de "copyFolder\%%~F"
. Observe que o ~p
modificador inclui o \
.