Asumiendo que sus nombres de archivo no tienen ningún espacio en blanco y no hay subdirectorios en ninguno de los directorios, lo siguiente imprimirá pares de nombres de archivo con sumas MD5 coincidentes:
join -o 1.2,2.2 <(md5sum $D1/* | sort) <(md5sum $D2/* | sort)
Para obtener solo uno de los nombres de archivo, use -o 1.2
o -o 2.2
.
Si los nombres de archivo (o rutas) pueden incluir espacios en blanco, deberá ser más inteligente.
Si un solo directorio puede tener el mismo archivo con más de un nombre, también deberá ser más inteligente, y deberá decidir exactamente qué hacer. Una posibilidad sería filtrar los duplicados antes de hacer la unión:
join -o 1.2,2.2 <(md5sum $D1/* | sort | uniq -w16) \
<(md5sum $D2/* | sort | uniq -w16)
NO UTILICE sum
sum
genera una suma de verificación de 16 bits; Si tiene incluso un par de cientos de archivos en cada directorio, es probable que obtenga un falso positivo si compara las sumas de verificación de 16 bits. md5sum
tampoco es absolutamente seguro, pero las posibilidades de una colisión con sumas de comprobación de 128 bits son muy pequeñas. En caso de duda, y si es realmente importante, cmp
los archivos también:
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
(Nuevamente, eso no funcionará si los archivos pueden tener espacios en blanco en sus nombres).
sum
es realmente una mala idea, ver en.wikipedia.org/wiki/Birthday_problem . Si tiene 300 archivos aleatorios diferentes, las probabilidades son más o menos iguales de que dos de ellos tengan lo mismosum
.openssl dgst -md5
. Mismo códigoesto podría hacer el trabajo, como con mpez0's ans para copiar los dups.
find {tst1,tst2} -exec sum {} {} \; 2> /dev/null | sort | uniq
fuente