私は最近、システムの一部のファイルをバージョン管理/バックアップする手段としてrsyncを使用しようとしました。
私の目標は、本質的にいくつかの特定のファイルを監視するようにrsyncを設定し、そのファイルがrysncに変更された場合は、そのファイルを最初のバックアップファイルを上書きするのではなく、別のファイルとして別の宛先にコピーすることです。
現在私が持っているものは次のとおりです。
rsync ~/Database/original.sqlite ~/Backup/backup`date +'.%F_%H-%M-%S'`.sqlite
1分タイマーとして実行されるエージェントとして実行されています。したがって、現在のところ、rsyncは基本的に何が起こっても毎分ファイルの新しいコピーを作成し続けます。
rsyncがバックアップフォルダの最新バージョンを確認し、データベースフォルダの元のファイルと比較し、ファイルが異なる場合は、新しいバックアップバージョンを作成する方法があれば完璧です。
本当にrsyncの限界を拡張しているのでしょうか?
どんなアドバイスもよろしくお願いします。
ベストアンサー1
常に実行されている場合の最も簡単な解決策は、ファイルが最後の瞬間に編集されていることを確認し、その場合はバックアップを作成することです。
#!/bin/bash
# get current time
now="$(date +'%s')"
# get modification time of fime
modified="$(stat -c '%Y' ~/Database/original.sqlite)"
# check if modified in the last minute
if (( modified > (now - 60) )) ; then
rsync ~/Database/original.sqlite ~/Backup/backup`date +'.%F_%H-%M-%S'`.sqlite
fi
非常に強力なバックアップが必要な場合は、最後のバックアップの名前またはタイムスタンプをファイルに書き込んで確認できます。しかし、もっと簡単にしたいかどうかはわかりません。
もう1つのオプションは、スクリプト自体を1分ごとに1回トリガーし、起動時に1回バックグラウンドで実行するようにすることです。これにより、スクリプトは最後の変更時刻自体を追跡できます。
#!/bin/bash
# initialize last backup at 0
lastbackup=0
while true ; do
# get modification time
modified="$(stat -c '%Y' ~/Database/original.sqlite)"
# check to see if it's been changed
if (( modified > lastbackup )) ; then
# do backup
rsync ~/Database/original.sqlite ~/Backup/backup`date +'.%F_%H-%M-%S'`.sqlite
# set the variable to its current modification time
lastbackup="$modified"
fi
done