Batch copia várias pastas e suas subpastas para uma pasta de mesclagem

1

Eu tenho uma pasta X:\Export que tem várias pastas:

X:\Export
+---Export1
|   \---various files …
+---Export2
|   \---… and subfolders
+---Export3
|   \---etc.
\---etc.            (names vary widely)

Cada pasta “Exportar” tem a mesma estrutura de subdiretórios, mas eles possuem arquivos diferentes (possivelmente com algumas colisões de nomes). Eu gostaria de copiar todas as subpastas e os arquivos de X:\Export\Export1 , X:\Export\Export2 , X:\Export\Export3 , etc., para uma pasta X:\Export\merged , mantendo a estrutura do subdiretório.

Pseudocódigo do que eu gostaria de fazer, mas não consigo trabalhar corretamente:

create new folder "merged"
for (every folder X in a given directory Y (i.e., X:\Export)
    copy every file in X keeping directory structure to "merged"
If conflict then overwrite
    
por DjLenny 12.10.2012 / 17:35

1 resposta

1

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.

    
por 12.10.2012 / 19:21