我有一个包含大量图片的目录(超过 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