重複ファイルを見つける


90

ディスク上で少しずつ同一であるが異なるファイル名を持つ重複ファイルを見つけることは可能ですか?


3
これを行う可能性のある方法は、常にシステム上のすべての単一ファイル他のすべてのファイルと比較する必要があることに注意してください。そのため、ショートカットを取る場合でも、これには長い時間がかかります。
シャドゥール

4
@Shadurは、チェックサムに問題がない場合、最終的にはハッシュだけを比較することになります-ほとんどのシステムでは、10 ^(5 + -1)のオーダーで、通常は64バイト未満のエントリです。もちろん、少なくとも1回はデータを読み取る必要があります。:)
ピーター

15
@Shadurそれは真実ではありません。一致するst_sizesをチェックし、同じもののみを含むものを削除してから、一致するst_sizesのmd5sumのみを計算することにより、時間を短縮できます。
クリスダウン

6
@Shadurは、ハッシュ操作を許可しない非常に愚かなアプローチでさえ、(ファイルコンテンツに基づいて)いくつかの並べ替えアルゴリズムを使用して、Θ(n²ではなく)Θ(n log n)比較でこれを行うことができます。
デロバート

1
@ChrisDownはい、サイズマッチングは私が念頭に置いていたショートカットの1つです。
シャドゥール

回答:


104

fdupesこれを行うことができます。からman fdupes

指定されたパスで重複ファイルを検索します。このようなファイルは、ファイルサイズとMD5シグネチャを比較し、続いてバイトごとに比較することで検出されます。

DebianまたはUbuntuでは、でインストールできますapt-get install fdupes。Fedora / Red Hat / CentOSでは、でインストールできますyum install fdupes。Arch Linuxではを使用できpacman -S fdupes、Gentooではemerge fdupes

かなりの時間とメモリを必要とする可能性があるファイルシステムルートから下に向かってチェックを実行するには、のようなものを使用しますfdupes -r /

コメントで尋ねられたように、次の操作を行うことで最大の重複を取得できます。

fdupes -r . | {
    while IFS= read -r file; do
        [[ $file ]] && du "$file"
    done
} | sort -n

ファイル名に改行が含まれている場合、これは壊れます。


ありがとう。最大の重複を除外するにはどうすればよいですか?サイズを人間が読めるようにするにはどうすればよいですか?
学生

@student:に沿って何かを使用します(fdupesが余分なinformatinosなしでファイル名を出力するか、またはそれfdupes ....... | xargs ls -alhd | egrep 'M |G 'を維持するためにカットまたはsedすることを確認してください):メガバイトまたはギガバイトのサイズのファイルのみを人間が読める形式で保持します。実際の出力に合わせてコマンドを変更します。
オリビエデュラック

2
@OlivierDulac lsを解析しないでください。通常はユースケースよりも悪いですが、ユースケースであっても、誤検出のリスクがあります。
クリスダウン

@student-ファイル名をdu取得しsortたら、パイプで通知されます。
クリスダウン

@ChrisDown:それは悪い習慣であり、偽陽性を与える可能性があるのは事実です。ただし、その場合(インタラクティブな使用、および表示のみの場合、 "rm"またはそれに直接依存するものは何もありません)、素晴らしくて迅速です^^。あなたがリンクしているページが大好きです(数か月前から読んでいて、多くの有用な情報がいっぱいです)
オリビエデュラック

26

別の優れたツールはfslint次のとおりです。

fslintは、重複ファイルや問題のあるファイル名など、ファイルシステムに関するさまざまな問題を見つけるためのツールセットです。

GUIに加えて個々のコマンドラインツールが利用可能であり、それらにアクセスするために、標準インストールの/ usr / share / fslint / fslintディレクトリを$ PATHに変更または追加できます。そのディレクトリ内のこれらの各コマンドには、パラメータの詳細を示す--helpオプションがあります。

   findup - find DUPlicate files

debianベースのシステムでは、次のものでインストールできます。

sudo apt-get install fslint

サードパーティのツールをインストールしたくない、またはインストールできない場合は、手動でこれを行うこともできます。このようなプログラムのほとんどは、ファイルのチェックサムを計算することにより機能します。同じmd5sumのファイルには、ほぼ確実にまったく同じデータが含まれます。したがって、次のようなことができます。

find / -type f -exec md5sum {} \; > md5sums
gawk '{print $1}' md5sums | sort | uniq -d > dupes
while read d; do echo "---"; grep $d md5sums | cut -d ' ' -f 2-; done < dupes 

サンプル出力(この例のファイル名は同じですが、異なる場合でも機能します):

$ while read d; do echo "---"; grep $d md5sums | cut -d ' ' -f 2-; done < dupes 
---
 /usr/src/linux-headers-3.2.0-3-common/include/linux/if_bonding.h
 /usr/src/linux-headers-3.2.0-4-common/include/linux/if_bonding.h
---
 /usr/src/linux-headers-3.2.0-3-common/include/linux/route.h
 /usr/src/linux-headers-3.2.0-4-common/include/linux/route.h
---
 /usr/src/linux-headers-3.2.0-3-common/include/drm/Kbuild
 /usr/src/linux-headers-3.2.0-4-common/include/drm/Kbuild
---

これは、前述の専用ツールよりもはるかに遅くなりますが、機能します。


4
を使用して別のファイルと同じサイズのファイルを見つけst_size、このサイズのファイルが1つしかないファイルを削除し、同じサイズのファイル間でのみmd5sumを計算すると、はるかに速くなりますst_size
クリスダウン

@ChrisDownええ、シンプルにしたかっただけです。あなたが提案することはもちろん物事を大幅にスピードアップします。だからこそ、私の答えの最後にそれが遅いという免責事項があります。
テルドン

8

簡単な答え:はい。

長いバージョン:ウィキペディアのfdupesエントリをご覧ください。既製のソリューションの非常に素晴らしいリストがあります。もちろん、そうではありません、自分自身を書くことができ、そのようなハッシュプログラム-難しいdiffsha*sumfindsortuniq仕事をする必要があります。1行に配置することもできますが、それでも理解できます。


6

ハッシュ関数(ここではMD5)がドメインで衝突しないと思われる場合:

find $target -type f -exec md5sum '{}' + | sort | uniq --all-repeated --check-chars=32 \
 | cut --characters=35-

同じファイル名をグループ化したいですか?not_uniq.sh出力をフォーマットする簡単なスクリプトを作成します。

#!/bin/bash

last_checksum=0
while read line; do
    checksum=${line:0:32}
    filename=${line:34}
    if [ $checksum == $last_checksum ]; then
        if [ ${last_filename:-0} != '0' ]; then
            echo $last_filename
            unset last_filename
        fi
        echo $filename
    else
        if [ ${last_filename:-0} == '0' ]; then
            echo "======="
        fi
        last_filename=$filename
    fi

    last_checksum=$checksum
done

次にfind、スクリプトを使用するようにコマンドを変更します。

chmod +x not_uniq.sh
find $target -type f -exec md5sum '{}' + | sort | not_uniq.sh

これは基本的な考え方です。findファイル名に文字が含まれている場合は、おそらく変更する必要があります。(例:スペース)


6

私は、fdupesの最近の強化フォークを追加するために考えjdupesになることを約束され、より迅速かつfdupes(例えばサイズフィルタ)よりも豊富な多くの機能:

jdupes . -rS -X size-:50m > myjdups.txt

これにより、現在のディレクトリで50MBを超える重複ファイルが再帰的に検索され、結果のリストがmyjdups.txtに出力されます。

出力はサイズでソートされておらず、ビルドされていないように見えるので、これを達成するために上記の@Chris_Downの回答を採用しました。

jdupes -r . -X size-:50m | {
    while IFS= read -r file; do
        [[ $file ]] && du "$file"
    done
} | sort -n > myjdups_sorted.txt

注:jdupesの最新バージョンは、全体をハッシュするのを待つのではなく、部分的なハッシュのみでファイルのマッチングをサポートします。非常に便利。(取得するにはgitアーカイブのクローンを作成する必要があります。)ここで使用しているオプションは次のとおりです。jdupes -r -T -T --exclude = size-:50m --nohidden
Benjamin

2

ウィキペディアには、このタスクに利用可能なオープンソースソフトウェアのリストに関する記事(http://en.wikipedia.org/wiki/List_of_duplicate_file_finders)がありましたが、現在は削除されています。

fslintのGUIバージョンは非常に興味深いものであり、マスクを使用して削除するファイルを選択できることを追加します。重複した写真をきれいにするのに非常に便利です。

Linuxでは次を使用できます。

- FSLint: http://www.pixelbeat.org/fslint/

- FDupes: https://en.wikipedia.org/wiki/Fdupes

- DupeGuru: https://www.hardcoded.net/dupeguru/

多くのシステム(windows、mac、linux)での最後の2つの作業、FSLintを確認していません


5
それを、単なるリンクここではなく、実際の情報を提供した方がよいのリンクが変更される可能性があり、その後、答えは左の値を持たない
Anthonの

2
ウィキペディアのページは空です。
ihor_dvoretskyi

はい、それはきれいになりました、なんて残念なことです...
MordicusEtCubitus

これらの3つのツールで編集しました
MordicusEtCubitus

0

これについての私の見解は次のとおりです。

find -type f -size +3M -print0 | while IFS= read -r -d '' i; do
  echo -n '.'
  if grep -q "$i" md5-partial.txt; then echo -e "\n$i  ---- Already counted, skipping."; continue; fi
  MD5=`dd bs=1M count=1 if="$i" status=noxfer | md5sum`
  MD5=`echo $MD5 | cut -d' ' -f1`
  if grep "$MD5" md5-partial.txt; then echo "\n$i  ----   Possible duplicate"; fi
  echo $MD5 $i >> md5-partial.txt
done

ファイルの最初の1 MBまでしかハッシュしないという点が異なります。
これにはいくつかの問題/機能があります:

  • 最初の1 MBの後に違いがある可能性があるため、結果はチェックする候補ではありません。後で修正するかもしれません。
  • 最初にファイルサイズで確認すると、これが速くなる可能性があります。
  • 3 MBを超えるファイルのみを取ります。

私はこれを使ってビデオクリップを比較するので、これで十分です。

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