シェルスクリプトでディレクトリ構造の変化を検出する

ownCloudサーバ側でファイルを追加するに書いたように、ownCloudを入れる目的の一つとしては、サーバにあるファイルのバックアップを自動で行うことである。

これを夜間の間に一日一度行うのだが、ただ、あまたある膨大な量のデータのすべてを毎日バックアップし、自動でクライアントPCにダウンロードするとなると無駄が多い。数日・数ヶ月間全く変更されないものもあるからだ。

つまり、バックアップ済のものに対して変化の無い場合はバックアップをしないようにしたい。このためには、以前バックアップしたものと異なるのか同じなのかを検出する必要がある。

最も簡単な方法

最も簡単な方法としては、ディレクトリ構造をまるごとownCloud管理の領域にタイムスタンプを同じにしてコピーしてしまうことである。あとは、ownCloudが違いを検出して適当にやってくれる。しかし、あまりにファイル数が膨大なため、ownCloud側の負担が大きくなってしまう。

なんとか、対象となるディレクトリをtarなりzipなりにして、それをownCloud側に登録したい。

tarやzipを比較する方法

ownClound側にいったん、tarなりzipなりを登録しておき、次回バックアップ時に再度tarなりzipなりを作成し、それをdiffやcmpで比較するという方法を思いついたが、実際に行ってみるとうまくいかない。

理由が全くわからないのだが、全く同じで何の変更もしていないのに「違っている」という結果が出てしまうのだ。この方法は諦めることにした。

既にバックアップ済のtarファイルを実際のディレクトリと比較する方法

GNU Tarにはdオプションというものがあり、tarと実際のディレクトリの違いを検出してくれる。例えば、testというディレクトリがあり、

tar zcf test.taz test
tar zdf test.taz test

とした場合、test.tazの中身がtestディレクトリと同じであるかを調べてくれる。ただし、

  • ファイルの中身までは調べてくれないようだ。タイムスタンプやサイズは比較してくれる。
  • test.tazの中のファイルがtestから削除されたことも検出してくれる。

ただし、testに新たなファイルが追加された場合は何も言ってくれない。一体なぜなのか理由がわからないのだが、これでは使えない。

単純な方法

最後に思いついたのは単純な方法である。単に「ls -lR」の出力を同時にバックアップしておき、再度「ls -lR」を行って違いがないかを調べるだけである。

ここにはファイルサイズとタイムスタンプも現れているし、ファイルの増減にも対応できる。非常に単純な解法であった。


./wp-includes/rest-api/fields: total 32 -rw-r--r-- 1 apache apache 702 Jul 27 2017 class-wp-rest-comment-meta-fields.php -rw-r--r-- 1 apache apache 13189 Jul 27 2017 class-wp-rest-meta-fields.php -rw-r--r-- 1 apache apache 1016 Jul 27 2017 class-wp-rest-post-meta-fields.php -rw-r--r-- 1 apache apache 1014 Jul 27 2017 class-wp-rest-term-meta-fields.php -rw-r--r-- 1 apache apache 675 Jul 27 2017 class-wp-rest-user-meta-fields.php ./wp-includes/theme-compat: total 36 -rw-r--r-- 1 apache apache 2112 Jul 6 2016 comments.php -rw-r--r-- 1 apache apache 970 Mar 29 2016 embed-404.php -rw-r--r-- 1 apache apache 3446 Oct 19 00:09 embed-content.php -rw-r--r-- 1 apache apache 479 Mar 29 2016 embed.php -rw-r--r-- 1 apache apache 438 May 26 2016 footer-embed.php