@Glytzhkof recomendou Robocopy em sua resposta, e se adequou perfeitamente às minhas necessidades.
tl; dr
C:\>robocopy.exe source target /l /e /zb /xx /xl /fp /ns /nc /ndl /np /njh /njs
C:\source\foo\bar\b.txt
Detalhes & Explicação das opções
Robocopy (Wikipedia) parece ser amplamente adotado para a administração do sistema Windows; é bem documentado (TechNet); é discutido como mais do que uma obscuridade em Stack Overflow , Falha do servidor e, claro, aqui em Super User ; fornece uma função específica em vez de tentar ser uma ferramenta de múltiplos propósitos (que tendem a inchar e bugs); e, além disso, tem fornecido essa função específica desde 1997. Para mim, todos esses fatores contribuem para a "transparência", apesar de ser de código fechado, e me acalmam.
O Robocopy é parte de um conjunto de ferramentas atualmente conhecido como Windows Server 2003 Resource Kit Ferramentas . Depois de fazer o download e instalar, recriou o cenário na minha pergunta e deu uma chance:
C:\>robocopy.exe source target /l /e /zb
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------
Started : Thu May 01 09:08:20 2014
Source : C:\source\
Dest : C:\target\
Files : *.*
Options : *.* /L /S /E /COPY:DAT /ZB /R:1000000 /W:30
------------------------------------------------------------------------------
0 C:\source\
1 C:\source\foo\
*EXTRA Dir -1 C:\target\foo\baz\
2 C:\source\foo\bar\
*EXTRA File 1 d.txt
Newer 5 b.txt
New File 1 c.txt
------------------------------------------------------------------------------
Total Copied Skipped Mismatch FAILED Extras
Dirs : 3 0 3 0 0 1
Files : 3 2 1 0 0 1
Bytes : 7 6 1 0 0 1
Times : 0:00:00 0:00:00 0:00:00 0:00:00
Ended : Thu May 01 09:08:20 2014
Parece bom! Deixe-me explicar as opções:
-
/l
lista ações sem executá-las. -
/e
inclui subdiretórios, mas ao contrário de/s
, também inclui diretórios vazios. -
/zb
de cópias no modo "reinicialização" e, no acesso negado, no modo "backup"; parece a abordagem mais segura; leia mais aqui .
Eu não precisei de nenhuma das opções relacionadas à cópia, pois não estou realmente realizando nenhuma ação.
De qualquer forma, em seguida, foi apenas uma questão de adicionar mais opções para obter a saída desejada:
C:\>robocopy.exe source target /l /e /zb /xx /xl /fp /ns /nc /ndl /np /njh /njs
C:\source\foo\bar\b.txt
Mais uma vez, vamos percorrer as opções.
Primeiro, eu só me importei com arquivos e pastas modificados , então:
-
/xx
exclui arquivos e diretórios "extras" - aqueles que existem apenas no destino. -
/xl
exclui arquivos e diretórios "solitários" - aqueles que existem apenas na origem.
Em segundo lugar, desejei caminhos relativos (ou pelo menos caminhos completos, não apenas nomes):
-
/fp
ativa caminhos completos (sem surpresa, não havia opção para caminhos relativos).
Em terceiro lugar, eu queria remover o máximo possível de registros, e fiquei agradavelmente surpreso ao descobrir que todos eram removíveis:
-
/ns
suprime os tamanhos dos arquivos. -
/nc
suprime as classes, por exemplo,Newer
. -
/ndl
suprime os nomes dos diretórios. -
/np
suprime a saída do progresso da cópia. -
/njh
suprime o cabeçalho do trabalho. -
/njs
suprime o resumo do trabalho.
E aí está você!
Para minhas finalidades (criação de backups com versão de arquivos alterados), percebi que realmente gostaria de ter o registro de data e hora de cada arquivo modificado também. Basta adicionar /ts
:
C:\>robocopy.exe source target /l /e /zb /xx /xl /fp /ns /nc /ndl /np /njh /njs /ts
2014/05/01 15:20:42 C:\source\foo\bar\b.txt