Come fare ciò dipende dal fatto che i file di immagine siano identici bit a bit o solo visivamente simili (ad esempio perché potrebbero avere commenti diversi o essere ricompressi, ritagliati ...).
Se i file sono identici e puoi rinominarli sia nell'origine che nell'archivio, è facile rinominarli per avere sempre lo stesso nome. Puoi mantenere il vecchio nome come collegamento simbolico. Non testato:
for orig in *.jpg; do
canon=$(<"$orig" md5sum | sed 's/ .*//').jpg
mv -i "$orig" "$canon"
ln -s "$canon" "$orig"
done
Questo presuppone che il tuo archivio sia una singola directory. Se ci sono sottodirectory, dovrai cambiare *.jpg
a **/*.jpg
(richiede bash 4 o zsh), e organizzare per aggiungere la giusta quantità di ../
al ln
comando.
Dopo questo rsync copierà solo il contenuto e il nome di nuove foto e nuovi nomi per le foto esistenti.
Se puoi rinominare i file solo nel tuo archivio, puoi comunque organizzare qualcosa con un uso intelligente dei link simbolici e probabilmente rsync --copy-unsafe-links
.
Se i file sono visivamente simili, è più complicato e non ci può essere una risposta completamente automatica (tra una versione ritagliata e una versione di bassa qualità, un essere umano deve fare la scelta). Alcuni strumenti per confrontare immagini visivamente simili possono aiutare, ad es. GQview (interattivo) o findimagedupes (riga di comando).
Tieni presente che, poiché non specifichi il tuo sistema operativo, ho avanzato suggerimenti che funzionano sul mio. Funzioneranno su qualsiasi sistema unix-like, inclusi OSX e Cygwin. L'idea di collegamento simbolico funzionerà anche in modo nativo su Windows XP e successivi (forse anche prima) ma richiede l'installazione di strumenti aggiuntivi.