Linuxで重複ファイルを確認するfdupesコマンド

重複ファイルを確認するfdupesを使ってみましょう

Linuxでファイルを探す場合にはfindコマンドなどを使っているかと思いますが、findの場合にはファイルに書かれている内容までが同じかを確認して検索しているわけでありません。

fdupesとは

fdupesは、ファイルサイズとmd5ハッシュ値を比較して、重複するファイルを抽出します。これによって異なるファイル名でも重複ファイルと判断することができます。
この判断って正しいの?っと、疑うと色々なものを信用できるものがなくなってしまうので、ほぼ間違いなく同じデータが含まれるファイルと考えます。

fdupesをインストールする

fdupesはyumコマンドやaptコマンドでインストールすることができます。

7の場合

yumコマンドでインストールするため、リポジトリ epel-release をインストールします。

[root@centos7-101 ~]# yum install epel-release
読み込んだプラグイン:fastestmirror
base                                                                         | 3.6 kB  00:00:00     
extras                                                                       | 3.4 kB  00:00:00     
packages-microsoft-com-prod                                                  | 2.9 kB  00:00:00     
updates                                                                      | 3.4 kB  00:00:00     
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ epel-release.noarch 0:7-9 を 
--> 依存性解決を終了しました。

依存性を解決しました

========================================================================
 Package      アーキテクチャー      バージョン           リポジトリー       容量
========================================================================
インストール中:
 epel-release noarch            7-9               extras         14 k

トランザクションの要約
====================================================================================================
  1 パッケージ

総ダウンロード容量: 14 k
インストール容量: 24 k
Is this ok [y/d/N]: y
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
epel-release-7-9.noarch.rpm                                                  |  14 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
警告: RPMDB は yum 以外で変更されました。
  インストール中         : epel-release-7-9.noarch                                 1/1 
  検証中               : epel-release-7-9.noarch                                             1/1 

:
  epel-release.noarch 0:7-9                                                                         

完了しました!

fdupesをインストールします

[root@centos7-101 ~]# yum install fdupes
読み込んだプラグイン:fastestmirror
epel/x86_64/metalink                                                         | 8.2 kB  00:00:00     
epel                                                                         | 4.7 kB  00:00:00     
(1/3): epel/x86_64/group_gz                                                  | 266 kB  00:00:00     
(2/3): epel/x86_64/updateinfo                                                | 862 kB  00:00:00     
To address this issue please refer to the below knowledge base article 

https://access.redhat.com/articles/1320623

If above article doesn't help to resolve this issue please create a bug on https://bugs.centos.org/

(3/3): epel/x86_64/primary_db                                                | 6.2 MB  00:00:00     
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.riken.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ fdupes.x86_64 1:1.6.1-1.el7 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

====================================================================================================
 Package               アーキテクチャー      バージョン                   リポジトリー         容量
====================================================================================================
インストール中:
 fdupes                x86_64                1:1.6.1-1.el7                epel                 28 k

トランザクションの要約
====================================================================================================
インストール  1 パッケージ

総ダウンロード容量: 28 k
インストール容量: 42 k
Is this ok [y/d/N]: y
Downloading packages:
警告: /var/cache/yum/x86_64/7/epel/packages/fdupes-1.6.1-1.el7.x86_64.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID 352c64e5: NOKEY
fdupes-1.6.1-1.el7.x86_64.rpm の公開鍵がインストールされていません
fdupes-1.6.1-1.el7.x86_64.rpm                                                |  28 kB  00:00:00     
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 から鍵を取得中です。
Importing GPG key 0x352C64E5:
 Userid     : "Fedora EPEL (7) "
 Fingerprint: 91e9 7d7c 4a5e 96f1 7f3e 888f 6a2f aea2 352c 64e5
 Package    : epel-release-7-9.noarch (@extras)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
上記の処理を行います。よろしいでしょうか? [y/N]y
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : 1:fdupes-1.6.1-1.el7.x86_64                                         1/1 
  検証中               : 1:fdupes-1.6.1-1.el7.x86_64                                         1/1 

インストール:
  fdupes.x86_64 1:1.6.1-1.el7                                                                       

完了しました!

17.10の場合(ここでは32bit版で試しています)

Ubuntuでは、aptコマンドでインストールします。

spdsk@vaiop-ubuntu1710-100:~$ sudo apt-get install fdupes
[sudo] spdsk のパスワード: 
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージが新たにインストールされます:
  fdupes
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 3 個。
18.9 kB のアーカイブを取得する必要があります。
この操作後に追加で 48.1 kB のディスク容量が消費されます。
取得:1 http://jp.archive.ubuntu.com/ubuntu artful/universe i386 fdupes i386 1:1.6.1-1 [18.9 kB]
18.9 kB を 0秒 で取得しました (287 kB/s)
以前に未選択のパッケージ fdupes を選択しています。
(データベースを読み込んでいます ... 現在 63974 個のファイルとディレクトリがインストールされています。)
.../fdupes_1%3a1.6.1-1_i386.deb を展開する準備をしています ...
fdupes (1:1.6.1-1) を展開しています...
fdupes (1:1.6.1-1) を設定しています ...
man-db (2.7.6.1-2) のトリガを処理しています ...
spdsk@vaiop-ubuntu1710-100:~$ which fdupes
/usr/bin/fdupes

fdupesの使い方

テスト用のディレクトリを作成して、ディレクトリ内にテスト用のファイルを作成しました。

[root@centos7-101 ~]# ll ./fdupes_test/
合計 240
-rw-------. 1 root root 17322 12月 31 17:21 yum.log
-rw-------. 1 root root 16829 12月 31 17:32 yum10.lg
-rw-------. 1 root root 16829 12月 31 17:32 yum10.log
-rw-------. 1 root root 16860 12月 31 17:32 yum2.log
-rw-------. 1 root root 16709 12月 31 17:32 yum3.log
-rw-------. 1 root root 16631 12月 31 17:48 yum4.log
-rw-------. 1 root root 16900 12月 31 17:48 yum5.log
-rw-------. 1 root root 17329 12月 31 17:48 yum6.log
-rw-------. 1 root root 16829 12月 31 17:32 yum7.log
-rw-------. 1 root root 17329 12月 31 17:48 yum8.log
-rw-------. 1 root root 17322 12月 31 17:21 yum9.log
-rw-------. 1 root root 17322 12月 31 17:21 yum9.logls

これだけならば、ファイルサイズが同じという点で、目視でもある程度はチェックできるかもしれません。
検索するにはfdupesコマンドに-rオプションを付けて実行します。

fdupes -r 対象のディレクトリ
[root@centos7-101 ~]# fdupes -r ./fdupes_test/
./fdupes_test/yum6.log                  
./fdupes_test/yum8.log

./fdupes_test/yum7.log
./fdupes_test/yum10.lg
./fdupes_test/yum10.log

./fdupes_test/yum.log
./fdupes_test/yum9.log
./fdupes_test/yum9.logls

検索と同時に重複ファイルを削除する場合は、-rdオプションを付けて実行します。 削除時にどのファイルを残すのか?の確認があります。下記の例は判り難いかもしれませんが、選択したファイルが残ることになります。

[root@centos7-101 ~]# fdupes -rd ./fdupes_test/
[1] ./fdupes_test/yum6.log              
[2] ./fdupes_test/yum8.log

Set 1 of 3, preserve files [1 - 2, all]: all

   [+] ./fdupes_test/yum6.log
   [+] ./fdupes_test/yum8.log

[1] ./fdupes_test/yum7.log
[2] ./fdupes_test/yum10.lg
[3] ./fdupes_test/yum10.log

Set 2 of 3, preserve files [1 - 3, all]: 2

   [-] ./fdupes_test/yum7.log
   [+] ./fdupes_test/yum10.lg
   [-] ./fdupes_test/yum10.log

[1] ./fdupes_test/yum.log
[2] ./fdupes_test/yum9.log
[3] ./fdupes_test/yum9.logls

Set 3 of 3, preserve files [1 - 3, all]: 2

   [-] ./fdupes_test/yum.log
   [+] ./fdupes_test/yum9.log
   [-] ./fdupes_test/yum9.logls

[root@centos7-101 ~]# ll ./fdupes_test/
合計 160
-rw-------. 1 root root 16829 12月 31 17:32 yum10.lg
-rw-------. 1 root root 16860 12月 31 17:32 yum2.log
-rw-------. 1 root root 16709 12月 31 17:32 yum3.log
-rw-------. 1 root root 16631 12月 31 17:48 yum4.log
-rw-------. 1 root root 16900 12月 31 17:48 yum5.log
-rw-------. 1 root root 17329 12月 31 17:48 yum6.log
-rw-------. 1 root root 17329 12月 31 17:48 yum8.log
-rw-------. 1 root root 17322 12月 31 17:21 yum9.log