Eu irei com Gilles e apontarei você para o Unison, como sugerido por hasen j . Unison foi DropBox 20 anos antes do DropBox. Código sólido de rock que muitas pessoas (inclusive eu) usam todos os dias - vale muito a pena aprender. Ainda assim, join
precisa de toda a publicidade possível:
Esta é apenas meia resposta, mas tenho que voltar ao trabalho:)
Basicamente, eu queria demonstrar o pouco conhecido join
utility que faz exatamente isso: junta duas tabelas em algum campo.
Primeiro, configure um caso de teste incluindo nomes de arquivos com espaços:
for d in a b 'c c'; do mkdir -p "old/$d"; echo $RANDOM > "old/${d}/${d}.txt"; done
cp -r old new
(edite alguns nomes de diretório e / ou arquivos em new
).
Agora, queremos criar um mapa: hash - > nome de arquivo para cada diretório e, em seguida, use join
para corresponder arquivos com o mesmo hash. Para gerar o mapa, coloque o seguinte em makemap.sh
:
find "$1" -type f -exec md5 -r "{}" \; \
| sed "s/\([a-z0-9]*\) ${1}\/\(.*\)/ \"\"/" \
makemap.sh
exibe um arquivo com linhas no formulário, 'hash "nome do arquivo"', portanto, apenas participamos da primeira coluna:
join <(./makemap.sh 'old') <(./makemap.sh 'new') >moves.txt
Isso gera moves.txt
, que é assim:
49787681dd7fcc685372784915855431 "a/a.txt" "bar/a.txt"
bfdaa3e91029d31610739d552ede0c26 "c c/c c.txt" "c c/c c.txt"
O próximo passo seria realmente fazer as jogadas, mas minhas tentativas ficaram nas citações ... mv -i
e mkdir -p
devem ser úteis.