如何在目录中查找最常见或最频繁的文件?

如何在目录中查找最常见或最频繁的文件?

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

相关内容