comando uniq não está funcionando corretamente?

22

Então, eu estou verificando o md5hash 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 33para encontrar os hashes exclusivos, recebo o seguinte:

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

No meu entendimento, apenas um dos quer derpina.txtou derp.txtdeve estar aparecendo uma vez que seus hashes são os mesmos. Estou esquecendo de algo? Alguém pode me esclarecer o porquê de resultados como este?

user2127726
fonte
1
Descobri isso. Aparentemente, o uniq não detecta linhas repetidas, a menos que elas sejam adjacentes. Link para resposta que me ajudou a stackoverflow.com/questions/23114677/…
user2127726

Respostas:

48

Você precisa usar sortantes uniq:

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

uniqremove apenas linhas repetidas. Não reordena as linhas procurando repetições. sortfaz essa parte.

Isso está documentado em man uniq:

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

John1024
fonte
uniqdeve ser alternativo, como sort -upadrão em todos os sistemas. Se necessário, ele sempre precisa de "classificação" para funcionar corretamente.
Devaroop 12/04
Essa mudança diminuiria alguma confusão. Por outro lado, uniqpossui muitos recursos não disponíveis no sort -u. Além disso, há casos em que se deseja usar uniqsem sort.
John1024 12/04
5

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

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

podia funcionar. O -w( --check-chars=N) torna as linhas exclusivas apenas em relação à primeira coluna; Esta opção funciona para este caso. mas as possibilidades de especificar as partes relevantes da linha uniqsã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 sorttem uma opção para as próprias linhas de saída exclusivas, e as linhas são exclusivas em relação às chaves usadas para classificação. Isso significa que podemos fazer uso da poderosa sintaxe da chave sortpara definir em qual parte as linhas devem ser uniq.

Por exemplo,

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

fornece apenas o mesmo resultado, mas a sortpeça é mais flexível para outros usos.

Volker Siegel
fonte