У меня есть несколько файлов в каталоге, и я хочу проверить, все ли они уникальны. Для простоты предположим, что у меня есть три файла: foo.txt
, bar.txt
и baz.txt
. Если я запустите этот цикл, я проверю их все друг против друга:
$ for f in ./*; do for i in ./*; do diff -q "$f" "$i"; done; done
Files bar.txt and baz.txt differ
Files bar.txt and foo.txt differ
Files baz.txt and bar.txt differ
Files baz.txt and foo.txt differ
Files foo.txt and bar.txt differ
Files foo.txt and baz.txt differ
Для сотен файлов, с которыми я хочу иметь дело, это станет довольно нечитаемым; было бы лучше , чтобы перечислить файлы , которые делают матч, и тогда я могу просмотреть список быстро и убедитесь , что файлы только соответствующим себя. С man-страницы, я бы подумал, что -s
вариант сделает это:
$ for f in ./*; do for i in ./*; do diff -s "$f" "$i"; done; done
Files bar.txt and bar.txt are identical
Files baz.txt and baz.txt are identical
Files foo.txt and foo.txt are identical
... однако на самом деле это также распечатывает все содержимое любых файлов, которые отличаются. Есть ли способ подавить это поведение, поэтому я получаю только поведение выше?
В качестве альтернативы, есть ли другой инструмент, который может это сделать ?
diff -qrs
при сравнении больших файлов (тихо подавляет различия при печати)Самый быстрый инструмент, написанный для этой цели, - это fdupes (он доступен в репозиториях пакетов Fedora и Ubuntu и…)
Использование:
источник
Если вам нужно найти идентичные файлы в списке, сначала отсортируйте их по размеру, например, с помощью
затем для каждой группы файлов одинакового размера запустите
md5sum
их, чтобы легко увидеть, какие из них идентичны.Для больших файлов может быть быстрее первой контрольной суммы только короткий кусок всего файла:
а затем выполнить полную контрольную сумму только для подозрительных файлов.
источник