コンピューターから重複した画像ファイルを削除する最良の方法は何ですか?


14

私のWindowsコンピューターには、サブフォルダーが異なり、ファイル名が異なる重複した画像ファイルがたくさんあります。

重複を削除するには、どのPythonスクリプトまたはフリーウェアプログラムをお勧めしますか?

(私はこの類似の質問を読みましたが、ポスターは異なるファイルサイズの視覚的な複製について尋ねています。私のものは異なるファイル名の正確な複製です。)


2
すべてのピクセルが同じ場合でも、現在提案されているほとんどのソリューションで問題を引き起こす異なるEXIF情報(何らかの段階で画像を処理するプログラムによって変更された)が残っている可能性があることに注意してください。
user12889

回答:


17

MD5の合計に依存しないでください。

MD5合計は、重複をチェックするための信頼できる方法ではなく、違いをチェックするための方法にすぎません。

MD5を使用して、可能な 重複候補を見つけ、MD5を共有する各ペアについて

  1. 両方のファイルを開きます
  2. 1つが異なるまで、これらのファイルを前方にシークします。

アイデンティティを重複してファイルするためのナイーブなアプローチをしている人々に落胆しているのを見てください。ハッシュアルゴリズムに完全に依存する場合は、善のために、SHA256やSHA512などのより厳しいものを使用してください、少なくとも、より多くのビットをチェックすることで合理的な程度。MD5は衝突条件に対して非常に弱いです。

また、ここで「ファイルチェック」というタイトルのメーリングリストを読むことをお勧めします。http//london.pm.org/pipermail/london.pm/Week-of-Mon-20080714/thread.html

「MD5はすべてのファイルを一意に識別できる」と言うと、論理エラーが発生しています。

長さ40,000バイトから100,000,000,000バイトまでのさまざまな長さの値の範囲を考えると、その範囲で使用可能な組み合わせの総数は、MD5で表される値の可能な数を大きく超え、わずか128ビットの長さです。

2 ^ 128の組み合わせのみで2 ^ 100,000,000,000の組み合わせを表しますか?私はそうは思わない。

少なくともナイーブな方法

重複を取り除く最も単純な方法であり、最も速い方法は次のとおりです。

  1. サイズ別:異なるサイズのファイルは同一にはできません。ファイルを開く必要がないため、これには少し時間がかかります。
  2. MD5による:異なるMD5 / Sha値を持つファイルは同一にはできません。これは、ファイル内のすべてのバイトを読み取って計算を実行する必要があるため、少し時間がかかりますが、複数の比較をすばやく行います。
  3. 上記の違いに失敗した場合:ファイルのバイトごとの比較を実行します。これは実行に時間がかかるテストであるため、他のすべての除去要因が検討されるまで放置されます。

Fdupesはこれを行います。また、同じ基準を使用するソフトウェアを使用する必要があります。


7
MD5が衝突するよりも、ハードドライブがイメージを魔法のように破壊する可能性が文字通り高くなります。「2 ^ 128の組み合わせのみで2 ^ 100,000,000,000の組み合わせを表す」-ここで同意します。彼が2 ^ 100,000,000,000枚の写真を持っている場合、MD5(またはほぼすべてのハッシュアルゴリズム)が悪いでしょう。
グレッグディーン

4
が存在しない保証、そのちょうどそうで。そのないことは不可能。10のファイルがあり、それらはすべて互いに衝突しますが、すべて完全に異なる可能性があります。これはめったにありませんが、発生する可能性があるため、テストする必要があります。
ケントフレドリック

2
ファイルサイズ、MD5、バイトチェックのバイトのみ。
ブラッドギルバート

3
@Kent-私はあなたに100%同意します。何かを無視するのは怠weです。なぜなら、私たちが話しているのと同じくらい起こりそうにないからです。プログラムを書いた人が何かをコーディングするのは面倒だと思ったからといって、私のデータの一部が破壊されたらイライラするでしょう。
ジョーテイラー

10

これは、Cygwinがインストールされた(Linuxを含む)OSやWindowsのようなUnix上の1つのライナーです。

find . -type f -print0 | xargs -0 shasum | sort |
  perl -ne '$sig=substr($_, 0, 40); $file=substr($_, 42); \
    unlink $file if $sig eq $prev; $prev = $sig'

意図的に作成されたコリジョンがないことがわかっている場合は、md5sum(約50%高速)を使用できます(自然に発生するmd5コリジョンを1つ見つけるよりも、10の主要な宝くじに勝つチャンスがあります)。

あなたが持っているすべてのDupを表示したい場合、それらを削除する代わりに、単にそのunlink $file部分をに変更してくださいprint $file, "\n"


1
-print0とxargs-0を使用してスペースをキャッチすることもできますが、findには便利な-execオプションもあります。-type f -exec shasum {} \; | sort ...また、スペースでは機能しないため、@ F(-a)は使用しないでください。代わりにsubstrを試してください。

いいですね、ジオカー。あなたの提案で答えを更新しました。

「意図的に作成された衝突がないことがわかっている場合は、md5sum(約50%高速)を使用できます」-正確に
グレッグディーン

6

私はUnixシステムで(fdupesCで書かれた)およびfreedups(Perl)を使用しましたが、Windowsでも動作する可能性があります。Windowsで動作すると主張されている同様のものもあります:dupmergeliten(Pythonで書かれています)など。


PerlとPythonソフトウェアは、ファイルシステムの詳細は関係ないと仮定して、Windowsシステムと* nixシステムで同じように動作するはずです。
-CarlF


1

代わりにDupliFinderの、代わりにフォークプロジェクトを試してみてくださいDeadRingerを。元のプロジェクトの多数のバグを修正し、多くの新機能を追加し、パフォーマンスを劇的に改善しました。


1

1つのオプションはDupkillerです。

DupKillerは、コンピューター上の重複または類似のファイルを検索および削除するための最速かつ最も強力なツールの1つです。その検索メカニズムに組み込まれた複雑なアルゴリズムは、高い結果、つまり迅速なファイル検索を実行します。多くのオプションにより、検索を柔軟にカスタマイズできます。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.