inotifywaitを用いたファイルのバージョニング・バックアップスクリプトの作成

設定ファイルの編集を行う際、ついつい忘れてしまうバックアップの取得…
ファイルが編集されたタイミングで、自動的にバックアップが取得されてるなら、やらなくても済むのに…

そんな時のために、今回はinotifywaitコマンドを利用してファイルの自動バックアップを行わせるスクリプトを作成した。
非常に簡単なスクリプトではあるが、バックアップファイルの名称には編集を行ったタイミングを付与するため、ファイルのバージョン管理も行わせることができる。

なお、当たり前だがこのスクリプトはinotifywaitコマンドを用いるため、inotify-toolがインストールされている事が前提となる。
インストール方法などについては、こちらを参照してもらいたい。

inotify_auto_backup.sh

#!/bin/sh

# 監視先のディレクトリを設定する
WATCH_DIR=/work
# バックアップファイルの取得先ディレクトリを設定する
BACKUP_DIR=/work2

# 監視処理を行う
inotifywait -m -r --format '%w%f' -e CLOSE_WRITE $WATCH_DIR -q | while read FILE
do
    BACKUP_FILE=`echo $FILE | sed -e 's#/#!#g'`.`date +%Y%m%d_%H%M%S`
    /bin/cp -p $FILE $BACKUP_DIR/$BACKUP_FILE
done 2>/dev/null

監視先、バックアップ先のディレクトリは仮設定。
実際に利用した際の状態が以下。まずはバックアップスクリプト(ここでは、/home/test/test.bin)をバックグラウンドで実行後、「/work」ディレクトリ配下に、適当に「test1234」というファイルを作成してみる。

test@test-vm-ubuntu:/work$ sh /home/test/test.bin &
[1] 14843
test@test-vm-ubuntu:/work$ ls -la /work
合計 12
drwxrwxrwx  2 test test 4096  5月  2 00:40 .
drwxr-xr-x 26 root root 4096  5月  1 23:47 ..
-rw-rw-r--  1 test test  213  5月  1 23:53 test.list
test@test-vm-ubuntu:/work$ ls -la /work2
合計 8
drwxrwxrwx  2 test test 4096  5月  2 00:41 .
drwxr-xr-x 26 root root 4096  5月  1 23:47 ..
test@test-vm-ubuntu:/work$
test@test-vm-ubuntu:/work$
test@test-vm-ubuntu:/work$ echo test > /work/test1234
test@test-vm-ubuntu:/work$
test@test-vm-ubuntu:/work$ ls -la /work
合計 16
drwxrwxrwx  2 test test 4096  5月  2 00:42 .
drwxr-xr-x 26 root root 4096  5月  1 23:47 ..
-rw-rw-r--  1 test test  213  5月  1 23:53 test.list
-rw-rw-r--  1 test test    5  5月  2 00:42 test1234
test@test-vm-ubuntu:/work$
test@test-vm-ubuntu:/work$ ls -la /work2
合計 12
-rw-rw-r--  1 test test    5  5月  2 00:42 !work!test1234.20150502_004203
drwxrwxrwx  2 test test 4096  5月  2 00:42 .
drwxr-xr-x 26 root root 4096  5月  1 23:47 ..
test@test-vm-ubuntu:/work$

確かに、バックアップファイルが取得されている事が確認できた。
事前にこのスクリプトを仕込んでおいて、設定ファイルに変更がある度にバックアップを自動的に取得させるようにすれば、いちいち事前バックアップを取らなくてもいいだろう。

問題としては、ファイルが書き換わるごとにその度にバックアップを取得するので、容量の大きいファイルのバックアップをさせるとHDDの容量を圧迫する点。
できれば、容量の小さい設定ファイルなどのみを監視対象とするようにしよう。

ちゃんとしたバージョン管理をするならば、while内の記述を変えてgitなどに渡すようにすると良いだろう。

なお、vimやemacsで編集した場合、swapファイルやバックアップファイルの作成場所が編集ファイルと同じ場所になっていると一緒にバックアップしてしまうので、できることであればswapファイルの作成をさせないようにしたり、バックアップファイルの作成場所を変更すると良いだろう。