Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

fdupesの使い方徹底解説:Linuxで重複ファイルを効率的に検索・削除できるコマンドラインツール

パソコンを使っていると、重複ファイルを探して整理したいという場面はよくあります。しかし、重複ファイルの検索と削除は手間と時間がかかる、地道な作業です。GNU/Linux環境なら、fdupesというユーティリティを使うことで、この作業を格段に簡単に行えます。

fdupesとは?

fdupesは、Adrian Lopez氏によってC言語で開発されたLinux向けユーティリティで、MITライセンスのもとで公開されています。指定したディレクトリやサブディレクトリ内から重複ファイルを検出できるのが特徴です。

fdupesは、まずファイルのMD5署名を比較し、その後にバイト単位の比較を行うことで重複を判定します。また、多数のコマンドオプションが用意されており、ファイルの一覧表示、削除、さらに重複ファイルへのハードリンク置き換えなども可能です。

比較は以下の順序で行われます。

サイズ比較部分的なMD5署名比較完全なMD5署名比較バイト単位の比較

段階的に絞り込むことで、無駄な処理を省き、高速かつ正確な検出を実現しています。

fdupesのインストール方法

最新版(fdupes 1.51)のインストールは簡単です。UbuntuLinux MintなどのDebian系システムでは、次のコマンドを実行するだけです。

$ sudo apt-get install fdupes

CentOS/RHELおよびFedora系のシステムでは、EPELリポジトリを有効にしてからfdupesパッケージをインストールします。

# yum install fdupes
# dnf install fdupes [Fedora 22以降]

注意:Fedora 22以降では、デフォルトのパッケージマネージャーがyumからdnfに変更されています。

fdupesコマンドの使い方

1. 検証用の重複ファイルを作成する

まずはデモンストレーション用に、ディレクトリ(例:tecmint)内に重複ファイルを作成してみましょう。

$ mkdir /home/"$USER"/Desktop/tecmint && cd /home/"$USER"/Desktop/tecmint && for i in {1..15}; do echo "I Love Tecmint. Tecmint is a very nice community of Linux Users." > tecmint${i}.txt ; done

コマンド実行後、lsコマンドで重複ファイルが作成されたか確認します。

$ ls -l
total 60
-rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint10.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint11.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint12.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint13.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint14.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint15.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint1.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint2.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint3.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint4.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint5.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint6.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint7.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint8.txt
-rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint9.txt

上記のスクリプトにより、tecmint1.txt〜tecmint15.txtまでの15個のファイルが作成され、すべて同じ内容になっています。

2. フォルダ内の重複ファイルを検索する

続いて、tecmintフォルダ内の重複ファイルを検索してみます。

$ fdupes /home/$USER/Desktop/tecmint 
/home/tecmint/Desktop/tecmint/tecmint13.txt
/home/tecmint/Desktop/tecmint/tecmint8.txt
/home/tecmint/Desktop/tecmint/tecmint11.txt
/home/tecmint/Desktop/tecmint/tecmint3.txt
/home/tecmint/Desktop/tecmint/tecmint4.txt
/home/tecmint/Desktop/tecmint/tecmint6.txt
/home/tecmint/Desktop/tecmint/tecmint7.txt
/home/tecmint/Desktop/tecmint/tecmint9.txt
/home/tecmint/Desktop/tecmint/tecmint10.txt
/home/tecmint/Desktop/tecmint/tecmint2.txt
/home/tecmint/Desktop/tecmint/tecmint5.txt
/home/tecmint/Desktop/tecmint/tecmint14.txt
/home/tecmint/Desktop/tecmint/tecmint1.txt
/home/tecmint/Desktop/tecmint/tecmint15.txt
/home/tecmint/Desktop/tecmint/tecmint12.txt

15個すべてのファイルが重複として検出されました。

3. サブディレクトリも含めて再帰的に検索する(-r オプション)

-rオプションを付けると、サブディレクトリを含めて再帰的に検索できます。

ファイル数やフォルダ数によってはスキャンに時間がかかりますが、その間もターミナルには進捗状況が表示されるので安心です。

$ fdupes -r /home
Progress [37780/54747] 69%

4. 重複ファイルのサイズを表示する(-S オプション)

-Sオプションを使うと、検出された重複ファイルのサイズを確認できます。

$ fdupes -S /home/$USER/Desktop/tecmint
65 bytes each: 
/home/tecmint/Desktop/tecmint/tecmint13.txt
/home/tecmint/Desktop/tecmint/tecmint8.txt
/home/tecmint/Desktop/tecmint/tecmint11.txt
/home/tecmint/Desktop/tecmint/tecmint3.txt
/home/tecmint/Desktop/tecmint/tecmint4.txt
/home/tecmint/Desktop/tecmint/tecmint6.txt
/home/tecmint/Desktop/tecmint/tecmint7.txt
/home/tecmint/Desktop/tecmint/tecmint9.txt
/home/tecmint/Desktop/tecmint/tecmint10.txt
/home/tecmint/Desktop/tecmint/tecmint2.txt
/home/tecmint/Desktop/tecmint/tecmint5.txt
/home/tecmint/Desktop/tecmint/tecmint14.txt
/home/tecmint/Desktop/tecmint/tecmint1.txt
/home/tecmint/Desktop/tecmint/tecmint15.txt
/home/tecmint/Desktop/tecmint/tecmint12.txt

5. 再帰検索とサイズ表示を組み合わせる(-Sr オプション)

-S-rを同時に指定すると、ディレクトリやサブディレクトリごとの重複ファイルサイズを一覧表示できます。

$ fdupes -Sr /home/avi/Desktop/
65 bytes each: 
/home/tecmint/Desktop/tecmint/tecmint13.txt
/home/tecmint/Desktop/tecmint/tecmint8.txt
/home/tecmint/Desktop/tecmint/tecmint11.txt
/home/tecmint/Desktop/tecmint/tecmint3.txt
/home/tecmint/Desktop/tecmint/tecmint4.txt
/home/tecmint/Desktop/tecmint/tecmint6.txt
/home/tecmint/Desktop/tecmint/tecmint7.txt
/home/tecmint/Desktop/tecmint/tecmint9.txt
/home/tecmint/Desktop/tecmint/tecmint10.txt
/home/tecmint/Desktop/tecmint/tecmint2.txt
/home/tecmint/Desktop/tecmint/tecmint5.txt
/home/tecmint/Desktop/tecmint/tecmint14.txt
/home/tecmint/Desktop/tecmint/tecmint1.txt
/home/tecmint/Desktop/tecmint/tecmint15.txt
/home/tecmint/Desktop/tecmint/tecmint12.txt
107 bytes each:
/home/tecmint/Desktop/resume_files/r-csc.html
/home/tecmint/Desktop/resume_files/fc.html

6. 複数のフォルダをまとめて検索する

1つのフォルダだけでなく、必要に応じて2つ以上のフォルダを指定して検索することもできます。もちろん-S-rオプションとの併用も可能です。

$ fdupes /home/avi/Desktop/ /home/avi/Templates/

7. 重複ファイルを削除する(-d オプション)

1つのコピーを残しつつ重複ファイルを削除したい場合は、-dオプションを使用します。

注意:この操作は元に戻せません。誤って必要なファイルを消さないよう、十分に注意して使用してください。

$ fdupes -d /home/$USER/Desktop/tecmint
[1] /home/tecmint/Desktop/tecmint/tecmint13.txt
[2] /home/tecmint/Desktop/tecmint/tecmint8.txt
[3] /home/tecmint/Desktop/tecmint/tecmint11.txt
[4] /home/tecmint/Desktop/tecmint/tecmint3.txt
[5] /home/tecmint/Desktop/tecmint/tecmint4.txt
[6] /home/tecmint/Desktop/tecmint/tecmint6.txt
[7] /home/tecmint/Desktop/tecmint/tecmint7.txt
[8] /home/tecmint/Desktop/tecmint/tecmint9.txt
[9] /home/tecmint/Desktop/tecmint/tecmint10.txt
[10] /home/tecmint/Desktop/tecmint/tecmint2.txt
[11] /home/tecmint/Desktop/tecmint/tecmint5.txt
[12] /home/tecmint/Desktop/tecmint/tecmint14.txt
[13] /home/tecmint/Desktop/tecmint/tecmint1.txt
[14] /home/tecmint/Desktop/tecmint/tecmint15.txt
[15] /home/tecmint/Desktop/tecmint/tecmint12.txt
Set 1 of 1, preserve files [1 - 15, all]: 

検出された重複ファイルがすべて一覧表示され、残すファイルを選択するよう求められます。番号を個別に指定したり、範囲指定でまとめて選択することも可能です。

例えば「2-15」と入力すると、2番目から15番目のファイルが削除対象となり、1番目のファイルのみが保持されます。「[-]」が削除対象、「[+]」が保持対象を示します。

Set 1 of 1, preserve files [1 - 15, all]: 2-15
 [-] /home/tecmint/Desktop/tecmint/tecmint13.txt
 [+] /home/tecmint/Desktop/tecmint/tecmint8.txt
 [-] /home/tecmint/Desktop/tecmint/tecmint11.txt
 [-] /home/tecmint/Desktop/tecmint/tecmint3.txt
 [-] /home/tecmint/Desktop/tecmint/tecmint4.txt
 [-] /home/tecmint/Desktop/tecmint/tecmint6.txt
 [-] /home/tecmint/Desktop/tecmint/tecmint7.txt
 [-] /home/tecmint/Desktop/tecmint/tecmint9.txt
 [-] /home/tecmint/Desktop/tecmint/tecmint10.txt
 [-] /home/tecmint/Desktop/tecmint/tecmint2.txt
 [-] /home/tecmint/Desktop/tecmint/tecmint5.txt
 [-] /home/tecmint/Desktop/tecmint/tecmint14.txt
 [-] /home/tecmint/Desktop/tecmint/tecmint1.txt
 [-] /home/tecmint/Desktop/tecmint/tecmint15.txt
 [-] /home/tecmint/Desktop/tecmint/tecmint12.txt

8. 削除前に結果をファイルに出力して確認する(安全対策)

安全性を重視するなら、あらかじめfdupesの出力をテキストファイルに保存し、どのファイルを削除すべきかじっくり検討してから操作するのがおすすめです。これにより、誤って重要なファイルを削除してしまうリスクを大幅に減らせます。

$ fdupes -Sr /home > /home/fdupes.txt

注意:「/home」の部分は任意のフォルダに置き換えてください。再帰的に検索したい場合は-r、サイズを表示したい場合は-Sをそれぞれ指定します。

9. 各セットの最初のファイルを除外する(-f オプション)

-fオプションを使うと、各重複セットの最初のファイルを結果から除外できます。

まず、ディレクトリ内のファイルを一覧表示します。

$ ls -l /home/$USER/Desktop/tecmint
total 20
-rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint9 (3rd copy).txt
-rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint9 (4th copy).txt
-rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint9 (another copy).txt
-rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint9 (copy).txt
-rw-r--r-- 1 tecmint tecmint 65 Aug 8 11:22 tecmint9.txt

そして、-fオプション付きでfdupesを実行すると、最初のファイル以外が表示されます。

$ fdupes -f /home/$USER/Desktop/tecmint
/home/tecmint/Desktop/tecmint9 (copy).txt
/home/tecmint/Desktop/tecmint9 (3rd copy).txt
/home/tecmint/Desktop/tecmint9 (another copy).txt
/home/tecmint/Desktop/tecmint9 (4th copy).txt

10. インストール済みのバージョンを確認する

$ fdupes --version
fdupes 1.51

11. ヘルプを表示する(-h オプション)

fdupesの使い方に困ったら、-hスイッチでヘルプを表示できます。利用可能な全オプションが確認できます。

$ fdupes -h
Usage: fdupes [options] DIRECTORY...
 -r --recurse for every directory given follow subdirectories
 encountered within
 -R --recurse: for each directory given after this option follow
 subdirectories encountered within (note the ':' at
 the end of the option, manpage for more details)
 -s --symlinks follow symlinks
 -H --hardlinks normally, when two or more files point to the same
 disk area they are treated as non-duplicates; this
 option will change this behavior
 -n --noempty exclude zero-length files from consideration
 -A --nohidden exclude hidden files from consideration
 -f --omitfirst omit the first file in each set of matches
 -1 --sameline list each set of matches on a single line
 -S --size show size of duplicate files
 -m --summarize summarize dupe information
 -q --quiet hide progress indicator
 -d --delete prompt user for files to preserve and delete all
 others; important: under particular circumstances,
 data may be lost when using this option together
 with -s or --symlinks, or when specifying a
 particular directory more than once; refer to the
 fdupes documentation for additional information
 -N --noprompt together with --delete, preserve the first file in
 each set of duplicates and delete the rest without
 prompting the user
 -v --version display fdupes version
 -h --help display this help message

主なオプションを日本語でまとめると以下の通りです。

  • -r / --recurse:サブディレクトリを再帰的に検索
  • -s / --symlinks:シンボリックリンクを追跡
  • -n / --noempty:サイズ0のファイルを除外
  • -A / --nohidden:隠しファイルを除外
  • -S / --size:重複ファイルのサイズを表示
  • -m / --summarize:重複情報の概要を表示
  • -d / --delete:残すファイルを選択して他を削除
  • -N / --noprompt:-dと併用し、確認なしで先頭ファイルを残して他を削除

補足:-dオプションは、シンボリックリンク(-s)と併用した場合や、同一ディレクトリを複数回指定した場合にデータ損失が発生する可能性があります。詳しくはfdupesの公式ドキュメントを参照してください。

まとめ

fdupesは、Linux環境で重複ファイルを素早く見つけて整理するための強力なコマンドラインツールです。段階的な比較アルゴリズムによる高速な検索性能と、柔軟なオプション群により、初心者から上級者まで幅広く活用できます。特に大量のファイルを扱うサーバー管理やバックアップ整理において、その真価を発揮するでしょう。

なお、同様の用途で使えるfslintという別のユーティリティもあります。こちらについても今後紹介する予定ですので、お楽しみに。

  1. 実用的な5つの例で学ぶBashスクリプト入門チュートリアル

    Unix SedやUnix Awkシリーズと同様に、本シリーズではBashスクリプティングに関する記事を複数回にわたって公開します。実用的なサンプルを交えながら、Bashスクリプティングのテクニックを幅広く解説していきます。 シェルとは、ユーザーが入力したコマンドを解釈して実行するプログラムです。コマンドはユーザーが直接入力するか、「シェルスクリプト」と呼ばれるファイルから読み込まれます。 ユーザーからの入力を直接読み取る場合、そのシェルは対話型(インタラクティブ)シェルと呼ばれます。 一方、ファイルからコマンドを読み込んで実行する場合は非対話型(ノンインタラクティブ)シェルと呼ばれます。この

  2. PuTTYを強化する12の必須アドオン|高度なSSH管理を実現する拡張ツール徹底解説

    PuTTYは、Windows環境で利用できる無料かつ軽量のSSHクライアントの中でも、特に高い評価を得ている定番ツールです。シンプルで安定した動作が魅力ですが、標準機能だけではカバーしきれない場面もあります。 本記事では、そんなPuTTYの弱点を補い、日々のサーバー管理業務を効率化する12個の強力なアドオンを、スクリーンショット付きで詳しく紹介します。それぞれの特徴を理解し、自分のワークスタイルに最適なものを見つけてください。 1. PuTTY Connection Manager(タブ形式でセッションを一元管理) PuTTYCMは、複数のPuTTYセッションを1つのウィンドウ内でタブ表示で