名前の異なる重複ファイルの検索と削除

名前の異なる重複ファイルの検索と削除

私のハードドライブには大規模な音楽コレクションが保存されています。通常、コピーはソースと同じディレクトリに存在します。

一般的な形式はファイル名.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

吸引。私はこれと重複する問題を解決するために、すべての重複エントリを一覧表示する1行を開発しました。どのくらいのメタ。まあ、無駄なものが恥ずかしいので、rdfindより良い解決策のように聞こえても投稿します。

これは、少なくとも「本物の」Unix方式という利点があります。 ;)

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

パイプを壊す:

find -name '*.mp3' -print0現在のディレクトリから始めて、サブツリー内のすべてのmp3ファイルを見つけて名前を印刷します(NULで区切ります)。

xargs -0 md5sumNULで区切られたリストを読み取り、各ファイルのチェックサムを計算します。

あなたは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" );

関連情報