自分はスキャンした本やら昔CDからリッピングしたmp3などが、大量にスマホのsdとバックアップ用のUSBハードディスクに、ほとんど同じ内容だが微妙に違っていて入っている。 それぞれ200GBずつ。 なおUSBハードディスクにはほとんど同じだが微妙に違うコピーが3つくらいある(つまりそれで600GBくらい占めている)。 どのディレクトリだけ違うかとかが分からなくなったので、日付ほって丸コピーしていった結果だ。

この3つのメディアにあるファイル群は、一部は移動されたりコピーされたり新規に追加されたりして、微妙にそれぞれ違いがあるが、だいたいは一緒。

同じファイルが複数の場所にあったりもして、整理すればたぶん150GBくらいになるんじゃないかなぁ、と思っているが、 もうどれが同じでどれが違うのか良く分からない。

さらに今回Google Play Musicがサービス終了という事でファイルを引き上げたのだが、もともとどこに置いていたのか分からなくなって管理が出来なくなりつつある。

そこでそのうちこの問題は自分でコード書いて解決しよう、という気になった。 今は労働しているのであまり趣味のコードを書く気はしないが、今のうちにどういうのが欲しいのかをなんとなく書き出したりしつつ考えておきたい。

以下重複する要素などもあるがなんとなく思っている事などを書き出しておく。

ファイルは一つにする

複数のファイルが複数のフォルダにあるのが事態を複雑にしているので、ファイルの実体はどこか一箇所にする。概念的には一つのファイルに対して複数のパスを持てる、みたいなイメージ。

すべてのファイルはハッシュ値を計算し、ハッシュ値が同じファイルは同じとみなして2つ目以降はオリジナルの場所のリンクを表すファイルに差し替える。

これはルートに置く何らかのKVSに突っ込み、ハッシュ値をキーにパスのリストを得るのと、パスをキーにハッシュ値を得られるようにする。

複数のパスの候補から実体をどこに置くかはデフォルトは最初にヒットした場所とするが、特定のフォルダ下の方に実体を集めるとかは選べるようにする。

例えばMusic下にかつてmp3ファイルとかがまとまっていたが、途中から自分は語学関連は国ごとにスキャンした参考書のデータと音声データを同じフォルダに置くように変更した。 でも音楽はMusic下のままに残っている。

こういう実体の一覧のようなのがどこかのフォルダ下にバーっとあるが、実際に最近使っているのはそことは違う場所、というケースが結構あるので、 実際に最近使っている場所に実体を置きたい場合はそう出来るようにする。

なるべく素朴なファイルだけでなんとかする

exFatが多いので、ファイルシステムには多くを期待しない。異なるファイルシステム間でsyncをする事も多いので、シンボリックリンクとかは使わない。

リンクは特別な拡張子のテキストファイルとして、中にリンク先へのパスとかを入れる程度にする。

KVSだけはなんらかのバイナリフォーマットというかBDBとかそれ系のライブラリを使うかもしれないが、他はなるべく普通のシェルコマンドでも手作業で同じ事が出来るようなシステムにしたい。

数十年後、データだけ見つかってもどうにか出来て欲しい

OSとかも変わってPCとかスマホじゃなくなって、データだけサルベージ出来ました、みたいな時にもやりたい事が出来て欲しい。 もちろんデータだけなのでこのシステムを実現するプログラム郡は失われている訳だが、その時でも特定のディレクトリ以下のファイルの実体をすべて取り出す事、などは、頑張れば手動で出来て欲しい。

バックアップは経験上20年以上残り続けるが、ここで書くシステムはきっと10年くらいで動かなくなる可能性が高いので、その後にもそんなに困らないようにしたい。

単純なコマンドの集まりで、半手動の余地を残す

全部をよきにはからって自動でsyncするのでは無く、個々の操作は手動で出来るようにし、それを集めて全部やってくれるコマンドをあとから作りたい。ようするにUnix的になっててほしい。

最初は特定ファイルのハッシュ値を求めるコマンドと、パスとハッシュ値のDBみたいなのを操作するコマンド、複数のパスを渡すと2つ目以降を一つ目のパスへのリンクファイルに置き換える、程度のコマンドから始めて、 しばらく手作業で使ってみたい。 このくらいなら2〜3日で出来るんじゃないか?

しばらく触ってみていい感じだと思ったら、それらをまとめて良くある操作を自動化したりしていきたい。

特殊なシチュエーションなどでエラーになっても、手動でどうにかやりたい事が出来るようになっててほしい。 開発初期から実際に半手動で使えるモノにして、それをだんだんと集めて自動化の度合いを増やしていく。

あまりsync対象をガチガチに管理するんじゃなくて、別口で手作業でちょっとmvとかcpとかしちゃったり、管理下に無いディレクトリが混ざっていてもいい感じに作業出来るようにしたい。