web-dev-qa-db-ja.com

重複ファイルを見つける

私のディスク上でビットごとに同一でファイル名が異なる重複ファイルを見つけることは可能ですか?

95
student

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

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

108
Chris Down

別の良いツールは 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
awk '{print $1}' md5sums | sort | uniq -d > dupes
while read -r d; do echo "---"; grep -- "$d" md5sums | cut -d ' ' -f 2-; done < dupes 

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

$ while read -r 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
---

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

27
terdon

短い答え:はい。

より長いバージョン:ウィキペディアを見てください fdupesエントリー 、これは既製のソリューションの非常に素晴らしいリストです。もちろん、あなたはあなた自身のものを書くことができます、それはそれ難しいことではありません-diffsha*sumfindsort、およびuniqが適切に機能します。あなたはそれを1行に置くことさえできます、そしてそれはまだ理解できるでしょう。

8
peterph

ハッシュ関数(ここでは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を変更する必要があります。 (例:スペース)

7
xin

私は最近拡張されたfdupeのフォーク、 jdupes を追加すると考えました。これはfasterであり、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
6

ウィキペディアには記事( 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をチェックしていません

2

これが私の見解です。

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より大きいファイルのみを取得します。

ビデオクリップの比較に使用するので、これで十分です。

0
Ondra Žižka