fdupesで削除順を制御する方法:ディレクトリ優先度で重複ファイルを残す

fdupesでディレクトリの入力順を使って重複ファイルの保持優先度を制御する方法。a、b、cの複数ディレクトリやサブディレクトリの順序指定も扱う。

fdupes で重複ファイルを削除するとき、abc の3つのディレクトリがあり、優先的に a を残し、次に b を残し、c の重複ファイルから削除したい場合、重要なのは複雑なルールではない。ディレクトリの入力順だ。

fdupes は非対話の削除モードでは、各重複グループで最初に見つかったファイルを残し、後から見つかった重複項目を削除する。そのため、ディレクトリ引数は「保持優先度が高いものから低いものへ」の順に並べる。

つまり、「先に c を削除し、次に b を削除し、できるだけ a を残す」には、次のように書く。

1
fdupes -rdN a b c

スキャン順は a -> b -> c になる。3つのディレクトリに同じファイルが存在する場合、a のファイルが先に見つかって保持され、bc の重複ファイルが削除される。bc だけに重複がある場合は、b が保持され、c が削除される。

パラメータの意味

よく使うパラメータは次の通り。

  • -r:サブディレクトリを再帰的にスキャンする。
  • -d:重複ファイルを削除する。
  • -N-d と組み合わせて使い、対話確認を行わず、各重複グループの最初のファイルを残して残りを削除する。

そのため、重複ファイルを自動削除する基本形式は次のようになる。

1
fdupes -rdN 目录A 目录B 目录C

ディレクトリが前にあるほど保持優先度が高い。後ろにあるほど、重複ファイルが削除されやすくなる。

削除前にプレビューする

-dN を直接使うとファイルが削除されるため、まず重複ファイルのグループを確認するのがよい。

1
fdupes -r a b c

出力は重複ファイルごとにグループ化される。各グループで前に表示されるファイルが、非対話削除時に保持されやすいファイルだ。

統計情報を見ることもできる。

1
fdupes -rm a b c

データが重要な場合は、結果を保存して手動で確認する。

1
fdupes -r a b c > duplicates.txt

各重複グループの並び順が期待通りであることを確認してから、次を実行する。

1
fdupes -rdN a b c

サブディレクトリの扱い

-r を有効にすると、fdupes は渡されたディレクトリ配下のすべてのファイルを再帰的にスキャンする。保持優先度を決めるのは、やはりコマンド内でパスが登場する順序だ。

例えば次のように実行する。

1
fdupes -rdN dir_a dir_b dir_c

これは次の意味になる。

  • dir_a の優先度が最も高い。
  • dir_b がその次。
  • dir_c が最も低い。

dir_a/sub1/file.txtdir_c/sub1/file.txt の内容が同じなら、dir_a 配下のファイルが保持される。dir_a/x/y/file.txtdir_c/file.txt の内容が同じ場合も、dir_a 配下のファイルが優先される。fdupes が比較するのはファイル内容であり、ファイル名やディレクトリ階層が完全に一致する必要はない。

サブディレクトリの優先度を細かく制御する

親ディレクトリだけを渡す場合、サブディレクトリ内部のスキャン順は fdupes の走査ロジックに従う。多くの場合はこれで十分だ。ただし、特定のサブディレクトリにより高い優先度を与えたい場合は、そのサブディレクトリを明示的に前へ書く。

例えば、まず dir_a を残し、次に dir_b/special を残し、その後 dir_b の残りを処理し、最後に dir_c を処理したい場合は次のようにする。

1
fdupes -rdN dir_a dir_b/special dir_b dir_c

これにより、dir_b/specialdir_b より先にスキャンされる。その後 dir_b がスキャンされる時点では、special 内のファイルはすでに記録されているため、dir_b の他の部分より高い優先度を持つ。

この書き方は次のような需要に向いている。

  • a が最も重要な基準ディレクトリ。
  • b の中の特定サブディレクトリが、b の他の内容より重要。
  • c は主に低優先度のバックアップディレクトリ。

パス順はさらに拡張できる。

1
fdupes -rdN a b/important b c/keep-first c

ルールは変わらない。前にあるほど優先的に保持される。

ディレクトリが多い場合はリストを使う

ディレクトリやサブディレクトリが多い場合、長いコマンドを手で書くと間違えやすい。優先度順にパスを folders.txt のようなテキストファイルへ書いておくとよい。

1
2
3
4
5
/path/to/dir_a
/path/to/dir_b/sub_important
/path/to/dir_b
/path/to/dir_c/sub_1
/path/to/dir_c

その後、xargsfdupes に渡す。

1
cat folders.txt | xargs fdupes -rdN

パスに空白が含まれる可能性がある場合は、NULL文字区切りを使うほうが安全だ。

1
tr '\n' '\0' < folders.txt | xargs -0 fdupes -rdN

注意すべき境界

第一に、fdupes が比較するのはファイル内容であり、ファイル名ではない。ファイル名が完全に違っていても、内容が同じなら重複ファイルとして扱われる。

第二に、a ディレクトリ内部に重複ファイルがある場合、fdupes -rdN a b c によって a 内部で後から見つかる重複項目も削除される可能性がある。このコマンドが表すのは「全体のスキャン順で最初に出たファイルを残す」ということであり、「a の中のファイルを絶対に削除しない」という意味ではない。

第三に、デフォルトでは fdupes はシンボリックリンクをたどらない。シンボリックリンク関連のファイルを処理する必要がある場合は、-s が必要かどうか、またそれがデータ安全上の期待に合うかを確認する。

第四に、fdupes は重複ファイルだけを削除し、空ディレクトリは削除しない。削除後に bc に空フォルダが残った場合は、次を実行できる。

1
find b c -type d -empty -delete

より安全な操作習慣

ディレクトリ内のデータが重要な場合、いきなり -rdN を実行するのは避けたい。より安全な流れは次の通り。

  1. まず fdupes -r a b c を実行して重複グループを見る。
  2. 各グループで先頭にあるファイルが本当に保持したいファイルか確認する。
  3. その後 fdupes -rdN a b c を実行して自動削除する。
  4. 削除後、空ディレクトリの整理が必要か確認する。

a 内のファイルを誤って削除するのが非常に心配な場合は、低優先度ディレクトリだけを小さい範囲で先に整理するか、結果を出力して手動で絞り込むとよい。fdupes のディレクトリ順は便利だが、権限分離ルールではない。スキャン対象に含まれたパス内の重複ファイルは、削除判断に参加する可能性がある。

まとめ

fdupes で優先度に従って重複ファイルを削除する核心は、「残したいディレクトリ」を前に置き、「優先的に削除したいディレクトリ」を後ろに置くことだ。

a を残し、次に b を残し、c を優先的に削除するなら次のようにする。

1
fdupes -rdN a b c

特定のサブディレクトリの優先度を高くしたいなら、親ディレクトリより前に単独で書く。

1
fdupes -rdN a b/important b c

覚えることは一つでよい。fdupes -dN は先に現れた重複ファイルを残し、後に現れた重複ファイルを削除する。ディレクトリ順こそが保持優先度だ。

记录并分享
Hugo で構築されています。
テーマ StackJimmy によって設計されています。