RmDupFile は指定された複数のファイルの中から同一内容のものを高速に検出 (および削除) する,Win32 コンソール・アプリケーションです. ここで「同一内容」とは,2つのファイルをバイナリファイルとして見たときに, サイズおよび内容が完全に一致することを意味します.
他の多くの Windows/Unix アプリケーションでは, +r に相当するオプションを指定した場合, 否応なしに全てのファイルが対象となるのが普通です.
以下,余談.
より正確に言うと,Unix の場合, ワイルドカードの展開は個々のコマンド (アプリケーション) ではなくシェルが行っています. 仮に自前でワイルドカードを展開するコマンドがあったとしても, ワイルドカードをそのコマンドに渡す (シェルが展開してしまわないようにする) ためにエスケープしたり, 引用符で囲ったりする必要があり,少々使いにくくなります.
Unix でディレクトリ・ツリー内の特定のファイルを選択するには, (効率は悪いが) find コマンドを使うのが普通です. find はまさに自前でワイルドカードを展開するコマンドの一つで, find に渡すワイルドカードはエスケープするか,引用符で囲む必要があります.
ダウンロードした LZH ファイルを解凍し,RmDupFile.exe を PATH に登録されているディレクトリの一つにコピーしてください.
RmDupFile は Win32 コンソール・アプリケーションなので, Windows のコマンド・プロンプト内で次のように入力してください.
+r を指定すると, それ以降のファイル名指定には全てのサブディレクトリが含まれます. -r を指定すると, それ以降のファイル名指定にはサブディレクトリは含まれません. 初期値 (デフォルト) は -r です.次に使用例を示します.
この例は,カレント・ディレクトリ (サブディレクトリは含まない) と, D:\BackUp およびその全てのサブディレクトリ内の *.txt を処理します. (この場合の -r は初期値と同じなので省略できます.)
ディレクトリ C:\foo\bar およびその全サブディレクトリに含まれる全てのファイルを指定するには, +r C:\foo\bar ではなく +r C:\foo\bar\* と指定してください. 前者は C:\foo およびその全サブディレクトリに含まれる bar というファイルを指定したことになります.
+d を指定すると,それ以後に発見された重複ファイルを削除します (ただし,同一内容のファイルで最初に見つかったものは削除しません). -d を指定すると削除しません.初期値は +d です.
+s を指定すると, それ以後に見つかった重複ファイル名を標準出力に出力します. -s を指定すると出力しません.初期値は +s です.表示形式は,+d/-d オプションのいずれが指定されているかにより異なります.
del "C:\directory\file.ext" … +d が指定されている場合+v を指定すると,それ以後検査されるファイル名を標準出力に出力します. -v を指定すると出力しません.初期値は -v です.
+l を指定すると,それ以後に検出される重複ファイル情報を CSV ファイルに出力します.-l を指定すると出力しません.初期値は -l です.
ファイル名を指定するには,最初の +l の直後に続けて +lD:\DupFiles.csv のように記述します. +l とファイル名の間に空白を入れないでください. ファイル名を指定しない場合のデフォルトは ".\$$DupFiles.csv" です. 使用する文字コードは u オプションで選択できます. CSV ファイルの各行の形式は次のとおりです.
<グループ番号>,<ファイル番号>,"<ファイルのフルパス名>"
<グループ番号> は,グループ (同一内容のファイル群) に対してつけられる番号で,1から順に採番されます.
<ファイル番号> は,グループ内の各ファイルにつけられる番号で, 出現順に1から採番されます.したがって1番のファイルは常に, +d オプションで削除されずに残されるファイルです.
+u を指定すると,ログファイルの文字コードを UTF-8 にします. -u を指定すると,デフォルトの文字コード (Windows が日本語に設定されていればシフト JIS) で出力します. 初期値は -u です.
'+' または '-' で始まるファイル名をそのまま指定すると, オプションと解釈されてしまい,エラーになったり, 誤った動作をしたりします.このような場合は, ファイル名の前に + または - オプションを指定します. + オプションと - オプションの意味は全く同じで, ファイル名の先頭文字と一致させる必要はありません. オプションとファイル名の間には空白を入れてください.
+j を指定すると,メッセージ (エラーメッセージおよび使用法) を日本語で表示します. -j ならば英語で表示します. 初期値は,コンソールが日本語モード (コードページ932) ならば +j,それ以外は -j です. (us および jp コマンドでコンソールの言語を切り替えることができます.)
+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)
引数 (ファイル名またはオプション) は,左から順に処理されます. そのため次のような使い方ができます.
複数のオプションをまとめて指定することができます. 例えば次の2つの行は等価です.
ただし一部のオプションについては注意が必要です.一括指定に + または - オプションを含める場合は,次のように最後にしなければなりません. (先頭や途中に現れる + および - は,他のオプションの ON/OFF を指定する文字と解釈されます.)
また,一括指定に最初の +l が含まれる場合は, その直後に続く文字列はログファイル名と見なされるため, 次のように一括指定の最後にしなければなりません. (-l および最初以外の +l はその必要はありません.)
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 & 検索 & 木構造" で検索してみてください.
Copyright © 2005-2006 noocyte, All rights reserved. E-mail: relipmoced (a) yahoo.co.jp (" (a) " を半角のアットマークに書き替えてください.) リンクはご自由に. 「noocyte のプログラミング研究室」トップページに戻る. |