
私のハードドライブには大規模な音楽コレクションが保存されています。通常、コピーはソースと同じディレクトリに存在します。
一般的な形式はファイル名.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 md5sum
NULで区切られたリストを読み取り、各ファイルのチェックサムを計算します。
あなたはsort
それが何をしているのか知っています。
uniq -Dw 32
ソートされた行の最初の32文字を比較して、同じハッシュ値を持つ文字のみを印刷します。
したがって、すべての重複リストが生成されます。次に、削除するアイテムに手動で減らし、ハッシュを削除してリストをrm
。
答え3
答え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" );