uniq comando não está funcionando corretamente?

14

Estou verificando o hash md5 dos meus arquivos com isso como minha saída:

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

No entanto, depois de executar find . -type f -exec md5sum '{}' ';' | uniq -w 33 para encontrar os hashes exclusivos, recebo este:

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

Pelo que entendi, apenas um dos derpina.txt ou derp.txt deve aparecer, pois os hashes são os mesmos. Estou esquecendo de algo? Alguém pode me esclarecer por que ele produz assim?

    
por user2127726 14.10.2014 / 02:44

3 respostas

33

Você precisa usar sort antes de uniq :

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

uniq apenas remove linhas repetidas. Não reordena as linhas à procura de repetições. sort faz essa parte.

Isso está documentado em man uniq :

  

Nota: 'uniq' não detecta linhas repetidas, a menos que sejam adjacentes. Você pode querer classificar a entrada primeiro ou usar sort -u' without uniq '.

    
por John1024 14.10.2014 / 03:11
5

A entrada para uniq precisa ser classificada. Então, para o caso de exemplo,

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

funcionaria. O -w ( --check-chars=N ) torna as linhas únicas somente em relação à primeira coluna; Esta opção funciona para este caso. mas as possibilidades de especificar as partes relevantes da linha para uniq são limitadas. Por exemplo, não há opções para especificar o trabalho em algumas colunas 3 e 5, ignorando a coluna 4.

O comando sort tem uma opção para linhas de saída exclusivas, e as linhas são exclusivas em relação às chaves usadas para classificação. Isso significa que podemos usar a poderosa sintaxe de chave de sort para definir em que parte as linhas devem ser uniq.

Para o exemplo,

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

fornece o mesmo resultado, mas a parte sort é mais flexível para outros usos.

    
por Volker Siegel 14.10.2014 / 03:41
0

Ou você pode instalar killdupes, meu programa para destruir todos os últimos duplicados de efeitos que existem!

link

: -)

    
por Batch McNulty 01.12.2017 / 20:59