команда uniq, не работающая правильно?

Таким образом, я проверяю md5 хеш моих файлов с этим как мой вывод:

657cf4512a77bf47c39a0482be8e41e0  ./dupes2.txt
657cf4512a77bf47c39a0482be8e41e0  ./dupes.txt
8d60a927ce0f411ec94ac26a4785f749  ./derpina.txt
15f63928b8a1d5337137c38b5d66eed3  ./foo.txt
8d60a927ce0f411ec94ac26a4785f749  ./derp.txt

Однако после выполнения find . -type f -exec md5sum '{}' ';' | uniq -w 33 для нахождения уникальных хешей, я получаю это:

657cf4512a77bf47c39a0482be8e41e0  ./dupes2.txt
8d60a927ce0f411ec94ac26a4785f749  ./derpina.txt
15f63928b8a1d5337137c38b5d66eed3  ./foo.txt
8d60a927ce0f411ec94ac26a4785f749  ./derp.txt

От моего понимания, только одного из также derpina.txt или derp.txt должен обнаруживаться, так как их хеши являются тем же. Я пропускаю что-то? Кто-либо может просветить меня относительно того, почему это производит как это?

22
задан 14 October 2014 в 05:13

3 ответа

Необходимо использовать sort прежде uniq:

find . -type f -exec md5sum {} ';' | sort | uniq -w 33

uniq только удаляет повторенные строки. Это не переупорядочивает строки, ища повторения. sort вносит свой вклад.

Это документируется в man uniq:

Примечание: 'uniq' не обнаруживает повторенные строки, если они не смежны. Можно хотеть отсортировать вход сначала или использование sort -u' without uniq'.

48
ответ дан 16 November 2019 в 12:08

Вход для uniq потребности, которые будут отсортированы. Таким образом для случая в качестве примера,

find . -type f -exec md5sum '{}' ';' | sort | uniq -w 33

работал бы. -w (--check-chars=N) делает строки уникальными только относительно первого столбца; Эта опция работает на этот случай. но возможности определить соответствующие части строки для uniq ограничены. Например, нет никаких опций определить работу над некоторым столбцом 3 и 5, игнорируя столбец 4.

, команда sort имеет опцию для уникальных выходных строк саму, и строки уникальны относительно ключей, используемых для сортировки. Это означает, что мы можем использовать мощный ключевой синтаксис sort для определения, относительно которого отделяются, строки должны быть uniq.

Для примера,

find . -type f -exec md5sum '{}' ';' | sort -k 1,1 -u

дает просто тот же результат, но sort часть более гибка для другого использования.

5
ответ дан 16 November 2019 в 12:08

Или Вы могли установить killdupes, моя программа для уничтожения каждого последнего дубликата effing существует!

https://github.com/batchmcnulty/killdupes

:-)

0
ответ дан 23 November 2019 в 01:32

Другие вопросы по тегам:

Похожие вопросы: