첫 번째 열이 동일한 경우에만 출력

첫 번째 열이 동일한 경우에만 출력

입력하다:

[USER@NOTEBOOK ~/proba] find . -type f | xargs -I "{}" md5sum "{}" | sort
18b17ef2e55f6fd2deb044943a8a769d  ./yes
2b00042f7481c7b056c4b410d28f33cf  ./tt.txt
2b00042f7481c7b056c4b410d28f33cf  ./tx.txt
698458eb994fafdf56c1f63295c942ad  ./laksjdasdff.txt
764efa883dda1e11db47671c4a3bbd9e  ./ize2.txt
764efa883dda1e11db47671c4a3bbd9e  ./ize3.txt
764efa883dda1e11db47671c4a3bbd9e  ./ize.txt
a787d6f5ce5deb6e2e4b004f95da5655  ./laksjdf.txt
[USER@NOTEBOOK ~/proba] 

산출:

[USER@NOTEBOOK ~/proba] find . -type f | xargs -I "{}" md5sum "{}" | sort | SOMEMAGIC
tt.txt tx.txt
ize2.txt ize3.txt ize.txt
[USER@NOTEBOOK ~/proba] 

따라서 md5sum이 일치하는 경우에만 파일 이름을 출력하는 "SOMEMAGIC"이 필요합니다(md5sum당 한 줄). (이것은 중복 제거 스크립트가 됩니다..)

답변1

이 "마법"을 사용해보세요 :)

find . -type f | xargs -I "{}" md5sum "{}" | awk '{count[$1]=count[$1]" "$2}END{for(j in count) if( (split(count[j], A)) > 1) print count[j]}' | sed -e 's/\.\///g'

답변2

첫 번째 스크립트는 다음 스크립트의 확장입니다.세르게이 로마코프답변입니다만, 댓글이 좀 너무 깁니다. 그것은 음식을 제공합니다파일 이름의 공백, 각 "이름"을 참조하십시오. 이 방법은 필요하지 않습니다유형단계.

두 번째 스크립트는 sort + awk를 사용하는 또 다른 방법이지만 첫 번째 방법의 배열 처리는 없습니다. 물론 이것이 문제가 된다면 입력 순서가 손실될 것입니다(그러나 이 문제에서는 어쨌든 정렬 단계를 사용하기 때문에 문제가 되지 않습니다).

두 가지 방법 모두 사용됩니다.sed\x00필드 구분 기호로 도입되어 공백 처리가 가능해졌습니다.

방법 1, awk에 배열.

find . -type f | 
  xargs -I {} md5sum {} |
    sed 's/ [ *]/\x00/' | # "  "==text, " *"==binary
      awk -F"\x00" '{
             if( md5s[$1] == "" ) {sep=""} else {sep=FS} 
             md5s[$1]=md5s[$1] sep $2 }
        END{ for(md5 in md5s ) {
               if( (split(md5s[md5], names, FS)) > 1 ) {
                 sep="\""  
                 for( ix in names ) {
                   printf "%s%s", sep, names[ix]
                   sep="\" \"" }
                 print "\"" } } }'

방법 2, 정렬 + awk.

find . -type f | 
  xargs -I {} md5sum {} |
    sort |sed 's/ [ *]/\x00/' | # "  "==text, " *"==binary
      awk -F"\x00" '{
             if (pkey!=$1) { ct=-1; pkey=$1; pnam=$2 }
             else{if (++ct) { printf(" \"%s\"",$2) }
                  else { printf("%s\"%s\" \"%s\"",nl,pnam,$2)
                         nl="\n" } } }
        END{ print "" }' 

산출

"./tt.txt" "./tx.txt"
"./ize2.txt" "./ize3.txt" "./ize.txt"

관련 정보