搜索并删除具有不同名称的重复文件

搜索并删除具有不同名称的重复文件

我的硬盘上存储着大量音乐收藏;浏览了一下,我发现在一些相册目录中有很多重复的文件。通常,副本与原始副本一起存在于同一目录中。

通常格式是文件名.mp3和重复的文件是文件名1.mp3。有时可能会有多个重复文件,并且我不知道跨文件夹是否存在重复文件(例如相册目录的重复项)。

有什么方法可以扫描这些重复文件(例如通过比较文件大小,或比较整个文件以检查它们是否相同),查看结果,然后删除重复项?名称较长的文件或修改/创建日期较新的文件通常是删除的目标。

有没有可以在 Linux 上执行此操作的程序?

答案1

有这样一个程序,它的名字是rdfind

SYNOPSIS
   rdfind [ options ] directory1 | file1 [ directory2 | file2 ] ...

DESCRIPTION
   rdfind  finds duplicate files across and/or within several directories.
   It calculates checksum only if necessary.  rdfind  runs  in  O(Nlog(N))
   time with N being the number of files.

   If  two  (or  more) equal files are found, the program decides which of
   them is the original and the rest are considered  duplicates.  This  is
   done  by  ranking  the  files  to each other and deciding which has the
   highest rank. See section RANKING for details.

它可以删除重复项,或用符号或硬链接替换它们。

答案2

哼。我刚刚开发了一个单行来列出所有重复项,以解决一个与此重复的问题。多么元。好吧,可惜浪费了它,所以我会发布它,尽管rdfind听起来是一个更好的解决方案。

这至少具有成为“真正的”Unix 方式的优点;)

find -name '*.mp3' -print0 | xargs -0 md5sum | sort | uniq -Dw 32

打破管道:

find -name '*.mp3' -print0查找从当前目录开始的子树中的所有 mp3 文件,并打印名称(以 NUL 分隔)。

xargs -0 md5sum读取 NUL 分隔的列表并计算每个文件的校验和。

你知道有什么sort作用。

uniq -Dw 32比较已排序行的前 32 个字符,并仅打印具有相同哈希值的字符。

所以你最终会得到所有重复项的列表。然后,您可以手动将其缩减为要删除的内容,删除哈希值,并将列表通过管道传输到rm.

答案3

我很高兴你完成了工作rdfind

下次还可以考虑rmlint。它的速度非常快,并提供了一些不同的选项帮助确定每组副本中哪个文件是原始文件。

答案4

我会考虑使用 Perl:

#!/usr/bin/perl
use strict;
use warnings;

use File::Find;
use Digest::SHA qw ( sha1_hex );

my %seen;

sub find_dupes {
    next if -d;
    local $/;
    open( my $input, "<", $File::Find::name ) or warn $!;
    my $sha1sum = sha1_hex(<$input>);
    close($input);
    if ( $seen{$sha1sum} ) {
        print "$File::Find::name is probably a dupe of $seen{$sha1sum} - both have $sha1sum\n";
    }
    $seen{$sha1sum} = $File::Find::name;
}

find( \&find_dupes, "/path/to/search", "/another/path/to/search" );

相关内容