警告: このコマンドは謝ってファイルを消去する恐れがある。ただしどのファイルを消すか確かめる機能は実装してある。
$0 FILE [FILE] ..
全く同じバイトサイズのファイルを検出する。 -m の指定により、MD5ハッシュ値が等しいかも見る。
引数はファイルを指定するが、ディレクトリが含まれていた場合には、そのディレクトリの直下のファイルも見る。
ハッシュ値を計算する場合は、実際にはファイルにアクセスするのでアクセス時刻が変わってしまうが、
その計算後に、計算前のアクセス時刻に戻すようにしている(OSに依存するかも知れない)。
利用例:
$0 **/*(.) # ZSHのファイル修飾子(.)でプレインなファイルだけを指定。
$0 **/*(/) # ZSHのファイル修飾子(/)でディレクトリのファイルだけを指定。引数が **/*(.)の場合より短くなる。
$0 `find . -type d` # Bash だとこうする。
オプション: (下記で N は数値を表す。他は固定文字列。オプションとパラメータの間の空白は省略可能。-aと-bは-abのようにできる。)
--help : このヘルプ画面を出力する。 --help opt とすると、-のつくオプションの説明だけを出力する。
-2 : 同じファイルのバイトサイズで,(-mが指定されたらハッシュ値も考慮して)2番目以降を取り出す。
-b N : 処理対象とする最小のバイトサイズ N を指定。0バイトファイルを避けるなら1を指定。
-D : 同じファイルサイズで,同じハッシュ値のものについて、2番目以降をファイル除去する。<-- 破壊的につき要注意。
-d 0 : 日時情報を出さない。(#1)
-d s : 分だけで無くて秒単位で出力する。(#2)
-f N : 同じファイルサイズで少なくとも何回(N)出現したものだけを取り出すか、の指定。初期値は2。
-l 0 : シンボリックリンクのファイルは、対象外にする。
-m : MD5ハッシュ値(32桁)を算出する。(なお、ファイルのアクセス時刻は変更しない工夫がしてある。)
-n : ドライラン。-D に対して、実際に削除は実行はしない。
-t : 同じファイルサイズなら、書換日時の古い順(time) (#3) 下記の(#5)の逆である。
-v 0 : 標準エラー出力に出力される2次情報を出力しない。
-~ s : 大きいファイル順に処理する。(#4)
-~ t : 同じファイルサイズなら、書換日時の新しい順。(#5) なお、-~ st と書くことで、(#4)と(#5)を同時指定できる。
利用例 :
$0 -f1 # 現行ディレクトリにおける全てのファイルについての情報を出力する。
$0 -f3 ~/Downloads # ダウンロード用ディレクトリ(OSXの場合)で、全く同じバイトサイズが3個以上あるファイルを見つける。
$0 -t # 同じサイズのファイルを新しい順序に並べる。(-D で削除する時に関係する。 )
$0 -~t # 同じサイズのファイルを古い順序に並べる。 ( 〃 )
$0 -D -n # 全く同じ内容のファイルについて、1個だけ残して削除。ただし-nによりドライランになる。
$0 -d0 # このプログラムを分かりやすくデモする画面を見せるために、各ファイルの日時情報の出力を抑制する。
注意 :
* 同一内容のファイルを1個だけ残すにしても、シンボリックリンクファイルだけ残して、参照先の元のファイルを消すこともあり得るので、要注意。
* 全く同一内容のファイルを消すにしても、シンボリックリンクファイルについては、参照先のファイルより時間関係が想定と異なる場合があるので、要注意。
開発上のメモ :
* -f N で 「N回以上現れた同じサイズかハッシュ値」に制限しているが、-y N..N のような柔軟な書き方を採用したい。
* ファイルサイズの小さい順に並ぶようになっている。これを逆順にするオプションは一回は検討したが、煩雑になるので棚上げ。
* SHA1も使えるように検討したが、MD5より時間がかかるので、使わないことにした。
* find コマンドのオプションのように数の前に±の符号をつけることで、以上や以下を指定できるように、このコマンドの-bを改造したい。
* --help demo や --help intro や --help remark などのオプションを検討中。