我有一個包含大量圖像的目錄(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