Предполагая, что в именах ваших файлов нет пробелов и в подкаталогах нет ни одного подкаталога, следующее выведет пары имен файлов с соответствующими суммами MD5:
join -o 1.2,2.2 <(md5sum $D1/* | sort) <(md5sum $D2/* | sort)
Чтобы получить только одно из имен файлов, используйте -o 1.2
или -o 2.2
.
Если имена файлов (или пути) могут содержать пробелы, вам нужно быть более умным.
Если в одном каталоге может быть один и тот же файл с более чем одним именем, вам также нужно быть более умным - и вам нужно будет точно решить, что делать. Одной из возможностей будет отфильтровать дубликаты перед выполнением объединения:
join -o 1.2,2.2 <(md5sum $D1/* | sort | uniq -w16) \
<(md5sum $D2/* | sort | uniq -w16)
НЕ ИСПОЛЬЗУЙТЕ sum
sum
выводит 16-битную контрольную сумму; если у вас есть даже пара сотен файлов в каждом каталоге, вполне вероятно, что вы получите ложное срабатывание при сравнении 16-битных контрольных сумм. md5sum
не является абсолютно безопасным, но вероятность столкновения с 128-битными контрольными суммами ничтожна. В случае сомнений и, если это действительно важно, также cmp
файлы:
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
(Опять же, это не сработает, если у файлов могут быть пробелы в именах.)