noocyte のプログラミング研究室 〜プログラムは楽しげに走らねばならない♪〜

RmDupFile:重複ファイル高速検出・削除ツール (Windows XP/2000)

公開:2006/08/29(火)
最終更新:2006/09/09(土)

0.目次

  1. 機能
    1. 重複ファイル検出・削除機能
    2. ファイル指定方法の特長
  2. ダウンロード
  3. インストール方法
  4. 使用法
    1. オプション
    2. 引数の処理順序
    3. オプションの一括指定
  5. 多数のファイルの中から重複ファイルを高速検出するアルゴリズム
  6. 現状の課題および今後の予定
  7. 更新履歴

1.機能

RmDupFile は指定された複数のファイルの中から同一内容のものを高速に検出 (および削除) する,Win32 コンソール・アプリケーションです. ここで「同一内容」とは,2つのファイルをバイナリファイルとして見たときに, サイズおよび内容が完全に一致することを意味します.

1.1 重複ファイル検出・削除機能

1.2 ファイル指定方法の特長


2.ダウンロード


3.インストール方法

ダウンロードした LZH ファイルを解凍し,RmDupFile.exe を PATH に登録されているディレクトリの一つにコピーしてください.


4.使用法

RmDupFile は Win32 コンソール・アプリケーションなので, Windows のコマンド・プロンプト内で次のように入力してください.

C:\somewhere>RmDupFile {<option> | <filename>} …

4.1 オプション

+r/-r   サブディレクトリを含める/含めない.(Recursive)

+r を指定すると, それ以降のファイル名指定には全てのサブディレクトリが含まれます. -r を指定すると, それ以降のファイル名指定にはサブディレクトリは含まれません. 初期値 (デフォルト) は -r です.次に使用例を示します.

RmDupFile -r *.txt +r D:\BackUp\*.txt

この例は,カレント・ディレクトリ (サブディレクトリは含まない) と, D:\BackUp およびその全てのサブディレクトリ内の *.txt を処理します. (この場合の -r は初期値と同じなので省略できます.)

ディレクトリ C:\foo\bar およびその全サブディレクトリに含まれる全てのファイルを指定するには, +r C:\foo\bar ではなく +r C:\foo\bar\* と指定してください. 前者は C:\foo およびその全サブディレクトリに含まれる bar というファイルを指定したことになります.

+d/-d   重複ファイルを削除する/しない.(Delete)

+d を指定すると,それ以後に発見された重複ファイルを削除します (ただし,同一内容のファイルで最初に見つかったものは削除しません). -d を指定すると削除しません.初期値は +d です.

+s/-s   重複ファイル名を表示する/しない.(Show)

+s を指定すると, それ以後に見つかった重複ファイル名を標準出力に出力します. -s を指定すると出力しません.初期値は +s です.表示形式は,+d/-d オプションのいずれが指定されているかにより異なります.

del "C:\directory\file.ext" … +d が指定されている場合
Duplicate: "C:\directory\file.ext" … -d が指定されている場合

+v/-v   検査中のファイル名を表示する/しない.(Verbose)

+v を指定すると,それ以後検査されるファイル名を標準出力に出力します. -v を指定すると出力しません.初期値は -v です.

+l[<CsvFile>]/-l   ログ (重複検出結果) ファイルを作成する/しない.(Log)

+l を指定すると,それ以後に検出される重複ファイル情報を CSV ファイルに出力します.-l を指定すると出力しません.初期値は -l です.

ファイル名を指定するには,最初の +l の直後に続けて +lD:\DupFiles.csv のように記述します. +l とファイル名の間に空白を入れないでください. ファイル名を指定しない場合のデフォルトは ".\$$DupFiles.csv" です. 使用する文字コードは u オプションで選択できます. CSV ファイルの各行の形式は次のとおりです.

<グループ番号>,<ファイル番号>,"<ファイルのフルパス名>"

<グループ番号> は,グループ (同一内容のファイル群) に対してつけられる番号で,1から順に採番されます.

<ファイル番号> は,グループ内の各ファイルにつけられる番号で, 出現順に1から採番されます.したがって1番のファイルは常に, +d オプションで削除されずに残されるファイルです.

+u/-u   ログファイルの文字コードを UTF-8/デフォルトにする.(UTF-8)

+u を指定すると,ログファイルの文字コードを UTF-8 にします. -u を指定すると,デフォルトの文字コード (Windows が日本語に設定されていればシフト JIS) で出力します. 初期値は -u です.

+/- <filename>   '+' または '-' で始まるファイル名を指定する.

'+' または '-' で始まるファイル名をそのまま指定すると, オプションと解釈されてしまい,エラーになったり, 誤った動作をしたりします.このような場合は, ファイル名の前に + または - オプションを指定します. + オプションと - オプションの意味は全く同じで, ファイル名の先頭文字と一致させる必要はありません. オプションとファイル名の間には空白を入れてください.

+j/-j   メッセージを日本語/英語で表示する.(Japanese)

+j を指定すると,メッセージ (エラーメッセージおよび使用法) を日本語で表示します. -j ならば英語で表示します. 初期値は,コンソールが日本語モード (コードページ932) ならば +j,それ以外は -j です. (us および jp コマンドでコンソールの言語を切り替えることができます.)

+i/-i   オプションおよびコードページ情報を表示する/しない.(Info)

+i を指定すると,現在のオプション設定,コンソール出力 (標準出力および標準エラー出力) のコードページ, ログファイルのコードページを標準出力に出力します. -i を指定すると出力しません.初期値は -i です. +i の場合,オプション設定が変更されるたびにこれらの情報が出力されます. 次に出力例を示します.

Options: -r +d +s -v +i +u +j +l"$$DupFiles.csv"
ConsoleOutputCodePage: 932 (ANSI/OEM - Japanese (Shift-JIS))
LogFileCodePage: 65001 (UTF-8)

4. 2 引数の処理順序

引数 (ファイル名またはオプション) は,左から順に処理されます. そのため次のような使い方ができます.

4. 3 オプションの一括指定

複数のオプションをまとめて指定することができます. 例えば次の2つの行は等価です.

RmDupFile +r +d +s -v -j directory\*
RmDupFile +rds-vj directory\*

ただし一部のオプションについては注意が必要です.一括指定に + または - オプションを含める場合は,次のように最後にしなければなりません. (先頭や途中に現れる + および - は,他のオプションの ON/OFF を指定する文字と解釈されます.)

RmDupFile +rds-vj+ --dir--\*

また,一括指定に最初の +l が含まれる場合は, その直後に続く文字列はログファイル名と見なされるため, 次のように一括指定の最後にしなければなりません. (-l および最初以外の +l はその必要はありません.)

RmDupFile -vj+rdslD:\DupFiles.csv directory\*

5.多数のファイルの中から重複ファイルを高速検出するアルゴリズム

n 個のファイルの中から重複ファイルを検出する方法として真っ先に思い浮かぶのは, ファイルを2つずつ取り出して比較することを, すべての組合せについて実行することです. しかしこの方法は,nC2=n * (n - 1) / 2 回の比較を行わなければならず,各ファイルは (n - 1) 回も読むことになります. n が大きいときは時間がかかりすぎて非実用的です.

RmDupFile ではこのような方法ではなく, 効率的に検索を行うための木構造の一種である PATRICIA (Practical Algorithm To Retrieve Information Coded In Alphanumeric) というデータ構造を使用し, 各ファイルの内容 (ビット列) を木構造の1つのパスとして表現します. そして,次のようにして重複ファイルの検出を行います.

最初,PATRICIA は空です. 最初のファイルを読むと,その内容 (ビット列) が PATRICIA の1本のパスとして格納されます. ファイルの先頭が木の根本側,末尾が葉っぱ側になります. 次に読み込むファイルは,最初の m ビット (m≧0) が第1のファイルと全く同じで, その後違いが生じるものとします. このファイルの読み込みは,PATRICIA に登録されている既存のパスと比較しながら行います. 最初の m ビットを読み終わるまでは, ファイルの内容と既存のパスが一致しているので何もしません. 最初に異なるビット ((m + 1) ビット目) が出現した時, パス内のその位置に新しい枝を作り, その枝にファイルの残りの部分を格納します.

3番目以降のファイルの読み込みも同様に行います. 2番目のファイルの読み込みと異なるのは, 読み込みの途中でパスの分岐点に遭遇する場合があるという点ですが, その場合はファイルの内容と一致している方の枝を選択して処理を続行します (比較はビット単位で行われるので,各分岐点での分岐の数は必ず2です). ファイルの読み込みが終了した時点で既存のパスの一つと一致していれば, 既読のファイルとの重複が検出されたことになります. (実際には, あるファイル A が別のファイル B より小さく,B の前半が A と完全に一致している場合などの処理が必要ですが, ここでは省略します.)

このように,ファイルを1回読むだけで, それ以前に読み込んだすべてのファイルとの一致/不一致が判定できます. したがって RmDupFile の実行に要する時間は, すべてのファイルを1回ずつ読む時間 (+PATRICIA のデータ構造を構築する時間) の総和です.関心のある方は "PATRICIA & 検索 & 木構造" で検索してみてください.


6.現状の課題および今後の予定


7.更新履歴

  1. 2005/07/10(日) Ver.1.0 :初版.
  2. 2006/03/24(金) Ver.1.10:l オプション追加.
  3. 2006/03/29(水) Ver.1.11:s,v オプション追加,メッセージを日本語化.
  4. 2006/03/30(木) Ver.1.12:L オプション追加.
  5. 2006/08/29(火) Ver.1.2:L オプション廃止,j オプション追加, メッセージを二カ国語化 (日英),Web で公開.
  6. 2006/08/31(木) Ver.2.0:内部コードを Unicode 化,u,i オプションを追加.
  7. 2006/09/02(土) Ver.2.1:ログファイルのフォーマットを変更,メモリ利用効率を改善.


Copyright © 2005-2006 noocyte, All rights reserved.
E-mail: relipmoced (a) yahoo.co.jp
  (" (a) " を半角のアットマークに書き替えてください.)
リンクはご自由に.
「noocyte のプログラミング研究室」トップページに戻る.