Copie arquivos com caminho relativo completo no Windows

Copie arquivos com caminho relativo completo no Windows

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\dir3se ele não existir na pasta copy_foldere colocasse uma cópia file.txtlá. Eu entendo que no Linux cp --parentfaz 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 /Yopçã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 ~pmodificador inclui o \.

informação relacionada