fdupes - Linux で重複ファイルを検索して削除するコマンド ライン ツール
重複ファイルを検索して置換することは、ほとんどのコンピュータ ユーザーにとって一般的な要件です。重複ファイルを見つけて削除するのは、時間と忍耐を必要とする面倒な作業です。マシンが GNU/Linux を搭載している場合、「fdupes」ユーティリティのおかげで、重複ファイルを見つけるのは非常に簡単です。
fdupesとは何ですか?
Fdupes は、Adrian Lopez によってC プログラミング言語で書かれた Linux ユーティリティで、MIT ライセンスの下でリリースされています。アプリケーションは、指定されたディレクトリおよびサブディレクトリのセット内で重複ファイルを見つけることができます。 Fdupes は、ファイルの MD5 署名を比較し、続いてバイトごとの比較を行うことによって重複を認識します。 Fdupes には多くのオプションを渡して、ファイルをリストし、削除し、重複へのハードリンクで置き換えることができます。
比較は次の順序で開始されます。
サイズの比較 > 部分的な MD5 署名の比較 > 完全な MD5 署名の比較 > バイト間の比較。
Linux に fdupe をインストールする
fdupes の最新バージョン (fdupes バージョン 1.51) のインストールは、Ubuntu や Linux Mint などのDebian ベースのシステムで次のコマンドを実行するだけで簡単です。
$ sudo apt-get install fdupes
CentOS/RHEL および Fedora ベースのシステムでは、fdupes パッケージをインストールするには epel リポジトリをオンにする必要があります。
# yum install fdupes
dnf install fdupes [On Fedora 22 onwards]
注: デフォルトのパッケージ マネージャー yum は、Fedora 22 の 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
上記のスクリプトは、15 個のファイル、つまり tecmint1.txt、tecmint2.txt…tecmint15.txt を作成し、すべてのファイルに同じデータが含まれています。
"I Love Tecmint. Tecmint is a very nice community of Linux Users."
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
3. -r オプションを使用して、サブディレクトリを含むすべてのディレクトリで重複を再帰的に検索します。
すべてのファイルとフォルダーを再帰的に検索しますが、ファイルとフォルダーの数によっては、重複をスキャンするのに時間がかかります。その間、次のような合計の進行状況がターミナルに表示されます。
$ fdupes -r /home
Progress [37780/54747] 69%
4. -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. -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 つのフォルダまたは 3 つのフォルダを選択することもできます。言うまでもなく、必要に応じてオプション -S や -r を使用できます。
$ fdupes /home/avi/Desktop/ /home/avi/Templates/
7. コピーを保存しながら重複ファイルを削除するには、オプション 「-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]:
すべての重複がリストされ、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」 を使用すると、各一致セットから最初のファイルを省略できます。
まずディレクトリ内のファイルを一覧表示します。
$ 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
そして、各一致セットから最初のファイルを除外します。
$ 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 のバージョンを確認します。
$ fdupes --version
fdupes 1.51
11. fdupe に関するヘルプが必要な場合は、スイッチ 「-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
以上です。 Linux でこれまでどのように重複ファイルを見つけて削除していたか教えてください。また、このユーティリティについてのあなたの意見も聞かせてください。貴重なフィードバックを以下のコメントセクションに記入してください。「いいね」を押したり共有したりして、拡散にご協力ください。
私は重複ファイルを削除するための fslint という別のユーティリティを開発中です。近日中に投稿する予定ですので、ぜひ読んでいただければと思います。