MENU

中身が同じ重複ファイルを探し出して整理する実務手順

バックアップを繰り返したり、複数人で共有ディレクトリを運用したりしていると、中身がまったく同じファイルが複数の場所に散らばることがあります。ファイル名や更新日時が違っていても、内容が一致していれば重複です。この記事では、Linuxでそうした重複ファイルを効率よく見つけ、安全に整理するための手順を紹介します。

目次

ハッシュ値で「中身が同じ」を判定する仕組み

ファイルの内容が一致しているかどうかをバイト単位で比較する方法もありますが、大量のファイルを扱う場合はハッシュ値(MD5・SHA256など)を使う方法が現実的です。ハッシュ値は「ファイルの指紋」のようなもので、まったく同じ内容であれば同一のハッシュ値が計算されます。ファイル名やパスが違っていても、ハッシュ値が一致すれば中身は同じです。

重複ファイル検出ツールの多くは、このハッシュ比較を内部で自動的に行っています。仕組みを理解しておくと、ツールの動作や出力結果を正しく読み取りやすくなります。

fdupes で重複ファイルをまとめて見つける

専用ツールの fdupes を使うと、ハッシュ比較を自動で行い重複ファイルをグループ単位で一覧表示できます。多くのディストリビューションで標準リポジトリから入手できます。

インストール

Debian/Ubuntu系の場合は次のコマンドでインストールします。

sudo apt install fdupes

RHEL/Rocky Linux系の場合は以下を使います。

sudo dnf install fdupes

基本的な使い方

指定したディレクトリ以下の重複ファイルを再帰的に検索して表示するには、-r オプションを付けます。

fdupes -r /対象ディレクトリ

重複しているファイルがグループ単位で表示されます。同じ内容のファイルが3つあれば、そのパスが3行まとめて出力されます。まず全体の件数だけ確認したいときは -S(サマリー)を追加します。

fdupes -r -S /対象ディレクトリ

find と md5sum を組み合わせる方法

fdupes が使えない環境や、スクリプトに組み込みたい場合は find と md5sum の組み合わせで同等の情報を得られます。

次のコマンドで対象ディレクトリ以下のすべてのファイルのハッシュ値を一覧できます。

find /対象ディレクトリ -type f -exec md5sum {} \; | sort

同じハッシュ値が複数行に現れているものが重複ファイルです。さらに絞り込んで、重複しているハッシュ値だけを抽出するには以下を使います。

find /対象ディレクトリ -type f -exec md5sum {} \; | sort | awk '{print $1}' | uniq -d

出力されたハッシュ値をもとに、どのファイルが重複しているかをさらに特定する場合は次のように使います。HASH の部分に抽出したハッシュ値を入れてください。

find /対象ディレクトリ -type f -exec md5sum {} \; | grep "^HASH"

重複ファイルを整理する

fdupes で対話的に削除する

-d オプションを付けると、グループごとに残すファイルを対話的に選択して削除できます。各グループで表示される番号を入力すると、選択したファイル以外が削除されます。

fdupes -r -d /対象ディレクトリ

確認なしに各グループの先頭ファイルを残して他を自動削除したい場合は -N を組み合わせます。ただし対話なしに削除が実行されるため、事前に -r だけで一覧を確認した後に使うようにしてください。

fdupes -r -d -N /対象ディレクトリ

削除以外の選択肢:ハードリンクへの置き換え

削除ではなくハードリンクに置き換えると、ファイルのパスを維持しながらディスク使用量を削減できます。fdupes の -L オプションがこの置き換えに対応しています。ただしハードリンクは inode を共有するため、片方のファイルを変更するともう片方にも影響します。アーカイブや読み取り専用の配布物など、ファイルを書き換えない用途に向いています。

整理後に重複がなくなったか確認する

削除後に重複が残っていないかどうかは、改めて fdupes -r /対象ディレクトリ を実行して出力が空になっていることで確認できます。

md5sum を使う場合は次のコマンドで重複ハッシュ値がゼロ件になっているかを確認できます。

find /対象ディレクトリ -type f -exec md5sum {} \; | sort | awk '{print $1}' | uniq -d | wc -l

出力が 0 であれば重複ファイルはありません。

よくあるつまずきと対処

MD5 は重複検出に使えるか:重複ファイルの検出においてMD5の衝突(異なる内容なのに同じハッシュ値になる)が実害を及ぼすケースはほぼありません。ただし、完全に確かめたい場合は md5sum を sha256sum に置き換えるか、ハッシュが一致したファイルを diff で直接比較してください。

シンボリックリンクを誤って対象にしてしまう:find -type f はシンボリックリンクを追わないため通常は問題ありません。fdupes もデフォルトではシンボリックリンクを追いません。-s オプションを付けると追うようになりますが、リンク先ファイルが重複検出の対象に入り意図しない削除につながることがあります。目的がはっきりしない限り -s は省いて実行してください。

意図的な複製を誤って削除しないために:内容が同じであっても、バックアップや世代管理として意図的に複数保持しているファイルが含まれることがあります。整理を進める前にディレクトリ構成を確認し、削除対象が本当に不要なものかを判断してから実行してください。-N のような自動削除オプションは、対象範囲を十分把握した後に使うのが安全です。

「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。

ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。

>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)

※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次