uniq 명령이 제대로 작동하지 않습니까?


22

그래서 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나타나야합니다. 뭔가 빠졌습니까? 아무도 왜 이런 식으로 출력되는지 가르쳐 줄 수 있습니까?


1
알아 냈습니다. 분명히 uniq는 인접하지 않는 한 반복되는 줄을 감지하지 못합니다. 대답 링크는 나에게 도움이 stackoverflow.com/questions/23114677/...
user2127726

답변:


48

당신은 sort전에 사용해야합니다 uniq:

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

uniq반복되는 줄만 제거합니다. 반복되는 행을 다시 정렬하지는 않습니다. sort그 부분을 수행합니다.

이 내용은 다음과 man uniq같습니다.

참고 : 'uniq'는 인접하지 않으면 반복되는 줄을 감지하지 않습니다. 먼저 입력을 정렬하거나 sort -u' withoutuniq '를 사용할 수 있습니다 .


uniqsort -u모든 시스템에서 기본적 으로 별명을 지정해야합니다 . 항상 제대로 작동하려면 항상 "정렬"이 필요합니다.
Devaroop

이러한 변화는 약간의 혼란을 덜어 줄 것입니다. 반면에는 uniq사용할 수없는 많은 기능이 있습니다 sort -u. 또한, uniq없이 사용하려는 경우가 있습니다 sort.
John1024

5

에 대한 입력을 uniq정렬해야합니다. 예를 들어,

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

작동 할 것이다. 는 -w( --check-chars=N) 첫 번째 열에 대한 고유 라인을 만든다; 이 옵션은이 경우에 작동합니다. 그러나 라인의 관련 부분을 지정할 가능성 uniq은 제한적입니다. 예를 들어, 열 4를 무시하고 일부 열 3과 5에 대한 작업을 지정할 수있는 옵션이 없습니다.

이 명령 sort에는 고유 한 출력 라인 자체에 대한 옵션이 있으며 정렬에 사용되는 키와 관련하여 해당 라인이 고유합니다. 즉, 우리는 강력한 키 구문 sort을 사용하여 라인이 어느 부분을 uniq해야하는지 정의 할 수 있습니다.

예를 들어,

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

결과는 동일하지만 sort다른 용도로는 더 유연합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.