En supposant que vos noms de fichiers ne comportent aucun espace et qu'il n'y ait aucun sous-répertoire dans l'un ou l'autre de ces répertoires, les éléments suivants imprimeront des paires de noms de fichiers avec des sommes MD5 correspondantes:
join -o 1.2,2.2 <(md5sum $D1/* | sort) <(md5sum $D2/* | sort)
Pour obtenir un seul nom de fichier, utilisez -o 1.2
ou -o 2.2
.
Si les noms de fichiers (ou chemins) peuvent inclure des espaces, vous devrez être plus intelligent.
Si un seul répertoire peut avoir le même fichier avec plusieurs noms, vous devrez également faire preuve de plus d'intelligence - et décider de la marche à suivre. Une possibilité serait de filtrer les doublons avant de faire la jointure:
join -o 1.2,2.2 <(md5sum $D1/* | sort | uniq -w16) \
<(md5sum $D2/* | sort | uniq -w16)
NE PAS UTILISER sum
sum
génère une somme de contrôle de 16 bits; si vous avez même quelques centaines de fichiers dans chaque répertoire, il est probable que vous obtiendrez un faux positif si vous comparez des sommes de contrôle 16 bits. md5sum
n’est pas non plus absolument sans danger, mais les probabilités d’une collision avec des sommes de contrôle de 128 bits sont infimes. En cas de doute, et si c'est vraiment important, cmp
les fichiers aussi:
join -o 1.2,2.2 <(md5sum $D1/* | sort) <(md5sum $D2/* | sort) |
while read F1 F2; do
if cmp -s $F1 $F2; then
cp F1 $D3
fi
done
(Encore une fois, cela ne fonctionnera pas si les noms des fichiers peuvent avoir des espaces.)
sum
C'est vraiment une mauvaise idée, voir en.wikipedia.org/wiki/Birthday_problem . Si vous avez 300 fichiers aléatoires différents, les chances sont à peu près égales que deux d'entre eux aient la même chosesum
.