[unix] find コマンドで s3 との sync を時間短縮してみる

今更なんだけれども、find で、ある期間内で更新されたものだけをピックアップしたい、なんてことを考えていた。


捜し物はなんですか

ファイルのバックアップを取りたい、なんて時には rsync –av しておけばいいじゃん、なんて気楽に考えてます。

ローカルのネットワークだったり、ssh/rsync で通信できるなら良いけれども、s3 などのオブジェクトストレージを使う場合、sync させるのは、はげしく時間を伴います。
s3cmd sync などの場合、まず最初の全件検査でいつ終わるの感が凄いわけです。ファイル数がそうでもなければ良いんですけど、我が家の写真だけでも数十万枚とかあるわけです。自分でもびっくりしましたけれども、そうなってくると、ファイル自体の同期以前に、「どのファイルをアップロードしようかなー」ってとこだけで朝が明けてしまうレベルです。時間があるときに、確実に同期させたいときはいいかもですが、これは難儀です。

そんな時に、こんなのも見つけました。

S3ってなんじゃ?(s3cmd syncではなくinotify+s3cmd sync (or put)) | cloudpack技術情報サイト

ファイルが更新されたら inotify でそのファイルをほぼリアルタイムに取得して、そのファイルをさっさとアップロードしてしまう。いいじゃん。悪くない。ただ、この shellが落っこちたら結構厄介だったり、その shellを監視してて、落ちたら再始動させるし組み入れたは良いけど、その落ちてるときにアップロードされなかったファイルってもしかして…? とか考えると面倒です。こういったバックアップなどの処理はバッチが良いです。「うまくいった」「いかない」が明確で、「断面がドコ」もハッキリしています。リランさせれば事がすむ場合も多いです。

次に見つけたのはこれです。

findコマンドのmtimeオプションについて

分かりやすい素晴らしいサイトです。今更ながら、findmtime のオプションがハッキリ分かりました。発見は、3パターンあるって知らなかったのと、-daystart オプション知らなかったことです。死んでしまえって感じですね。しかし、このオプションを組み合わせれば、デイリーでバックアップとるのも簡単なわけですよ!

例えば

find /mnt/share/ -daystart -mtime 1

ってやれば、いつ実行開始したとか関係なく、「昨日更新された /mnt/share/ 配下の全てのファイル」がゲットできるわけです。これを、うまいこと s3cmd put とかに喰わせ続ければ、悔いはないはずです。ほんで、もしバッチ処理に失敗したら、どの日かは明確なので、同日ならリランすれば良いし、数日過ぎていても -mtime ? の数字を適切に変えれば問題ない。ステキ。

と言うことで、それ以前の問題の 25万ファイル同期をまずやっているのが今日です。そのうち、ちゃんと実装したいなーΣ ゚д゚≡(   ノ)ノ エッ?

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です