今更なんだけれども、find で、ある期間内で更新されたものだけをピックアップしたい、なんてことを考えていた。
ファイルのバックアップを取りたい、なんて時には rsync –av しておけばいいじゃん、なんて気楽に考えてます。
ローカルのネットワークだったり、ssh/rsync で通信できるなら良いけれども、s3 などのオブジェクトストレージを使う場合、sync させるのは、はげしく時間を伴います。
s3cmd sync などの場合、まず最初の全件検査でいつ終わるの感が凄いわけです。ファイル数がそうでもなければ良いんですけど、我が家の写真だけでも数十万枚とかあるわけです。自分でもびっくりしましたけれども、そうなってくると、ファイル自体の同期以前に、「どのファイルをアップロードしようかなー」ってとこだけで朝が明けてしまうレベルです。時間があるときに、確実に同期させたいときはいいかもですが、これは難儀です。
そんな時に、こんなのも見つけました。
S3ってなんじゃ?(s3cmd syncではなくinotify+s3cmd sync (or put)) | cloudpack技術情報サイト
ファイルが更新されたら inotify でそのファイルをほぼリアルタイムに取得して、そのファイルをさっさとアップロードしてしまう。いいじゃん。悪くない。ただ、この shellが落っこちたら結構厄介だったり、その shellを監視してて、落ちたら再始動させるし組み入れたは良いけど、その落ちてるときにアップロードされなかったファイルってもしかして…? とか考えると面倒です。こういったバックアップなどの処理はバッチが良いです。「うまくいった」「いかない」が明確で、「断面がドコ」もハッキリしています。リランさせれば事がすむ場合も多いです。
次に見つけたのはこれです。
分かりやすい素晴らしいサイトです。今更ながら、find の mtime のオプションがハッキリ分かりました。発見は、3パターンあるって知らなかったのと、-daystart オプション知らなかったことです。死んでしまえって感じですね。しかし、このオプションを組み合わせれば、デイリーでバックアップとるのも簡単なわけですよ!
例えば
1 | find /mnt/share/ -daystart -mtime 1 |
ってやれば、いつ実行開始したとか関係なく、「昨日更新された /mnt/share/ 配下の全てのファイル」がゲットできるわけです。これを、うまいこと s3cmd put とかに喰わせ続ければ、悔いはないはずです。ほんで、もしバッチ処理に失敗したら、どの日かは明確なので、同日ならリランすれば良いし、数日過ぎていても -mtime ? の数字を適切に変えれば問題ない。ステキ。
と言うことで、それ以前の問題の 25万ファイル同期をまずやっているのが今日です。そのうち、ちゃんと実装したいなーΣ ゚д゚≡( ノ)ノ エッ?