디렉토리에서 가장 일반적이거나 자주 사용되는 파일을 찾는 방법은 무엇입니까?

디렉토리에서 가장 일반적이거나 자주 사용되는 파일을 찾는 방법은 무엇입니까?

나는 이미지가 많은(100,000+) 디렉토리를 가지고 있습니다. 이들 중 다수는 중복/동일한 이미지이지만 분명히 모두 파일 이름이 다릅니다. 이 디렉토리에서 가장 많이 중복된 이미지를 찾아야 합니다. 예를 들어 file1.jpeg에는 120개의 중복 항목이 있고, file2.jpeg에는 90개의 중복 항목이 있습니다.

나는 각 파일의 md5를 가져와 일종의 작업을 수행할 것이라고 생각했지만 세부 사항에 대해서는 잘 모르겠습니다. 쉘 스크립트로 이 작업을 수행할 수 있습니까?

명확하게 말하자면, 아직 중복 항목을 제거할 필요는 없으며 어떤 파일에 가장 많은 복사본이 있는지 찾아야 합니다.

도움이 된다면 저는 OS X를 사용하고 있습니다.

답변1

파일이 완전히 중복된 경우 출력을 후처리하는 것이 shasum * | sort도움이 될 수 있습니다. 계산에 시간이 걸리고 두 번 이상 필요할 수 있으므로 파일에 저장하세요.

shasum * | sort >/tmp/shasums

예를 들어, 동일한 파일의 확산을 보려면(파일 이름이 아닌 체크섬만 사용하여) 다음을 수행하십시오.

</tmp/shasums cut -d ' ' -f 1 | uniq -c

파일 이름과 중복 개수를 모두 확인하는 방법은 다음과 같습니다.

</tmp/shasums sed 's/ .*//' | uniq -c - | join -1 2 - /tmp/shasums | sort -k 2,1

GNU uniq이 없으면 다음 Perl 스크립트보다 파일 이름을 보기 좋게 표시할 수 있는 방법이 없습니다.

</tmp/shasums perl -lne '
    s/^([^ ]*?)  //; # set $1 to the checksum and $2 to the filename
    push @{$names{$1}}, $_; # dispatch file names by checksum
    END {
        # iterate through the checksums, sorted by repeat count
        foreach (sort {@$a <=> @$b} values %names) {
            # print the repeat count and the file names
            printf "%d %s\n", scalar(@$_), join(" ", @$_)
        }
    }'

답변2

이것은 하이픈 줄 사이에 중복된 이름을 인쇄하는 빠르고 더러운 파이프라인입니다. 현재 디렉터리에서만 검색되지만 find재귀 검색을 수행하는 데 사용할 수 있습니다.

md5sum *.jpeg | sort | awk '{if ($1 != prev) print "-----"; print $2; prev = $1}'

예제 출력:

-----
unique1.jpeg
-----
dup1.jpeg
dup2.jpeg
dup3.jpeg
-----
same1.jpeg
same2.jpeg
-----
solo1.jpeg

관련 정보