Que tal
@echo off md merged for /f "delims=" %%f in ('dir /b /ad') do ( if not %%f==merged xcopy "%%f" merged /s /y )
A opção /y
faz com que os arquivos sejam sobrescritos sem solicitar confirmação. Substitua /s
por /e
se você quiser copiar subdiretórios vazios.
Explicação adicional: for /f "options"(optional)variable in ('command')
runs command , captura a saída, atribui tokens (strings) dessa saída à variável e, em seguida, executa o (s) comando (s) após o do
. dir /b
significa mostrar apenas nomes de arquivos (sem atributos, sem .
e ..
); dir /ad
significa apenas diretórios de lista (sem arquivos).
O comportamento padrão para for /f
é criar um token de cada linha de saída levando todos os caracteres até o primeiro espaço. A opção "delims="
diz para ocupar toda a linha. Esse pouco de paranoia faz o script funcionar mesmo se você tiver nomes de diretório com espaços neles. Eu provavelmente poderia ter fugido dizendo xcopy %%f merged
; mas preciso das aspas duplas em torno de %%f
( xcopy "%%f" merged
) para manipular o caso em que %%f
contém espaços.