重複ファイルの検索

重複ファイルの検索

私のディスクで同じですが、ファイル名が異なる重複ファイルを見つけることはできますか?

答え1

fdupesこれは可能です。からman fdupes

特定のパスで重複ファイルを検索します。これらのファイルは、ファイルサイズをMD5署名と比較し、バイト単位で比較することによって検索されます。

Debian または Ubuntu ではapt-get install fdupes.Fedora/Red Hat/CentOS ではyum install fdupes.Arch Linuxpacman -S fdupesではemerge fdupes.

ファイルシステムのルートから開始してスキャンを実行するには(多くの時間とメモリがかかる場合があります)、次のものを使用してくださいfdupes -r /

コメントで要求されたように、次のことを行うことで最大重複数を得ることができます。

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

ファイル名に改行文字が含まれていると中断されます。

答え2

もう一つの良いツールは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
---

これは〜になりますたくさんすでに述べた専用ツールよりも遅いが動作します。

答え3

最近強化されたfdupesブランチを追加したいと思います。デュピュ、これ急いでfdupesよりも機能が豊富です(サイズフィルタなど)。

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

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

出力はサイズごとにソートされておらず、組み込まれていないようなので、これを達成するために上記の@Chris_Downの答えを調整しました。

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

答え4

ハッシュ関数(ここでは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ファイル名に特定の文字が含まれている場合は、名前を変更する必要があります。 (例:宇宙)

関連情報