如何找到目錄中最常見或最常用的檔案?

如何找到目錄中最常見或最常用的檔案?

我有一個包含大量圖像的目錄(100,000+)。其中許多是重複/相同的圖像,但顯然都有不同的檔案名稱。我需要找到該目錄中重複次數最多的圖像。例如,file1.jpeg 有 120 個重複項,file2.jpeg 有 90 個重複項,等等。

我想我會得到每個檔案的 md5 並做某種排序,但我對細節很模糊。這可以透過 shell 腳本完成嗎?

需要明確的是,我還不需要刪除重複項,我需要找到哪些檔案擁有最多的副本。

如果有幫助的話,我在 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

相關內容