私は最近、システムの一部のファイルをバージョン管理/バックアップする手段として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
答え2
以下を使用できます。
rsync -au ~/Database/original.sqlite ~/Backup/
-u オプションは次のことを意味します。
--update, -u レシーバーで最新のファイルをスキップする
したがって、rsyncは、ソースフォルダのファイルが最新の場合にのみ、ターゲットフォルダのファイルを上書きします。
それではあなたはできます。変更の監視ターゲットフォルダの特定のファイルを選択し、必要に応じてコピーします。
- 更新 -
ファイルの変更を監視するには、次のスクリプトの行に沿って操作を実行できます(リンクされた質問で修正済み)。これを行うにはinotify-tools
(sudo apt install inotify-tools
Ubuntuから)
#! /bin/bash
f=~/Backup/original.sqlite
touch $f
inotifywait -m -e modify "$f" --format "%e" | while read -r event; do
if [ "$event" == "MODIFY" ]; then
prev="$curr"
curr=$(<"$f")
[ "$curr" == "$prev" ] || echo "$f changed: do something"
fi
done
スクリプトを実行すると、変更が監視されます。このスクリプトはecho "$f changed: do something"
単なる例ですが、必要に応じて適用できます。たとえばcp $f destination_file
。