Como fazer isso, depende se seus arquivos de imagem são idênticos aos bits ou se são visualmente semelhantes (por exemplo, porque eles podem ter comentários diferentes ou serem recompactados, recortados ...).
Se os arquivos forem idênticos e você puder renomeá-los na origem e no arquivo, será fácil renomeá-los para sempre ter o mesmo nome. Você pode manter o nome antigo como um link simbólico. Não testado:
for orig in *.jpg; do
canon=$(<"$orig" md5sum | sed 's/ .*//').jpg
mv -i "$orig" "$canon"
ln -s "$canon" "$orig"
done
Isso pressupõe que seu arquivo seja um único diretório. Se houver subdiretórios, você precisará alterar *.jpg
para **/*.jpg
(requer o bash 4 ou zsh) e organizar para adicionar a quantia correta de ../
ao comando ln
.
Depois disso, o rsync copiará apenas o conteúdo e o nome de novas fotos e novos nomes para fotos existentes.
Se você puder renomear os arquivos apenas no seu arquivo, você ainda pode organizar algo com o uso inteligente de links simbólicos e provavelmente rsync --copy-unsafe-links
.
Se os arquivos são visualmente semelhantes, é mais complicado, e não pode haver uma resposta totalmente automatizada (entre uma versão recortada e uma versão de baixa qualidade, um ser humano tem que fazer a escolha). Algumas ferramentas para comparar imagens visualmente semelhantes podem ajudar, por ex. gqview (interativo) ou findimagedupes (linha de comando).
Observe que, como você não especifica seu sistema operacional, fiz sugestões que funcionam no meu. Eles vão trabalhar em qualquer sistema similar ao UNIX, incluindo OSX e Cygwin. A ideia de link simbólico também funcionará nativamente no Windows XP e mais recente (talvez até mais cedo), mas requer a instalação de ferramentas adicionais.