fision を inoctl に改名して公開2009年02月15日 11時38分51秒

以前に、同一内容のファイルを単一 i-node にまとめるプログラムを fision と命名して公開した。今回、これを inoctl と改名して、更新版を公開する。

機能は、内容の同じファイルを見つけて、同じ i-node に割り当てる事だ。

実は 2008 年の中頃に再度必要になり、その遅さに嫌気がさしたので、高速化した。線型探索から二分木探索に変えたので、だいぶ改善した。その時に公開するのを忘れてしまった。最近、いじっていたのだが、また更新頻度が減って来たので、忘れないうちに公開する事にしたのが、今回の事の運びだ。

今回の主な変更点は以下の通り。

  1. 高速化
  2. -m link_max
  3. -c cmp
  4. -f file

高速化は既に上で述べた通りだ。

-m オプションで、ハードリンクの最大数を指定できる。以前の版は、この扱いが怪しい部分があったが、これを修正した。同じ内容のファイルを同一 i-node に集める時には問題なく動作する。これは、file1 と file2 の内容が同じときに、file2 を削除してハードリンクに置き換える時の動作だ。

実験的な実装として、-m で指定された最大数よりも多いハードリンクを持つものは、他の i-node に割り当てる機能を実装した。既に全ての i-node が -m の最大値に達している時は複製を作る。もし、file1 と file2 が同じ i-node だとし、inoctl で -m 1 を指定すると、file2 を削除し、cp をすることで i-node の数を下げる。同じ i-node を持つファイル全てが、inoctl に処理される時は問題ないはずだが、一部しか処理の対象として渡されずに、-m の最大数よりも下に減らさなければいけない時の動作に自信が無い。実は、i-node の数を増やしたり、減らしたり出来る様になったので、INOde CoNTrol に改名した。

また、-c を指定すると cmp(1) プログラムを呼び出してファイルの内容を比較する。inoctl はファイルの大きさが同じで、md5、sha1、sha256 の全てが同じ場合に、内容が同一だと認定する。確率的には違うファイルの三つのシグナチャが全て同じになる可能性は低いが、絶対的な確実性は無い。このオプションを使うと確実に検証できるが、その分実行速度は遅くなる。

-f にてファイル名を指定できるようにした。-f - で stdin から読む。find(1) などを使って、予め大きいファイルだけを抜き出しておくのに使う。細かいファイルを集めても回収できる容量が少ないが、コマンドラインの引数からは大きすぎて渡せないからだ。

ファイルを削除する動作を伴うので、使う時は -n で何が起きるのかを正しく把握してから使って頂きたい。バックアップを取ってからと言いたいところだが、自身でもバックアップを取る容量が無くなったからこのプログラムを作ったので、微妙な立場だ。

前回