
短い質問:動的に生成された2つのtarアーカイブがあります(したがってタイムスタンプが異なります)。時間差を無視してどのように比較しますか?
背景...
私はスクリプトを使用してバックアップする必要がある項目を作成し、ディレクトリに配置し、そのディレクトリをtarしていくつかの以前のバージョンを保持するいくつかのバックアップを実行しています。作業時間が失われないようにするには、バックアップスクリプトを30分ごとに実行する必要があります。
これで、データが変更されない特定の期間があるため、同じコンテンツのコピーを繰り返し保存する必要がないことに気づきました。保存する前にアーカイブを比較したいです。私の試みは、新しいデータが含まれている場合にのみ実行してcmp newdata.tar.gz olddata.tar.gz
保存することです。newdata.tar.gz
明らかに、これはタイムスタンプが異なるため動作しません。
答え1
これを行うには3つの方法があります。最初は私の好みです。
ファイル作成プロセスの変更
dump_table foo >foo.dump
古いファイルが新しいファイルと同じ場合は、ファイルを無分別に再生成するのではなく古いファイルを保持します()。
dump_table foo >foo.dump.new
if cmp foo.dump foo.dump.new; then
rm foo.dump.new
else
mv foo.dump.new foo.dump
fi
ファイルをディレクトリにマウント
使用AVFS#
すべてのアーカイブは、アーカイブの内容を保持しているように見える関連ディレクトリ(同じ名前、最後に追加)を含むディレクトリ階層全体のビューを作成します。
mountavfs
d=$(date -d %Y%m%d%H%M%S); mkdir $d; tar czf /path/to/$d.tgz $d; rmdir $d
cd /path/to/back/up
rsync -ac --compare-dest=~/.avfs/path/to/yesterday.tgz . ~/.avfs/path/to/$d.tgz
必要な機能を備えたバックアップツールを使用する
バックアップ手順は非常に安定している必要があります。国内ソリューションがすべての状況をカバーするのは難しいです。したがって、完全なバックアッププログラムを検討してください。私の考えでは二重性必要な作業を行います。増分バックアップを実行してrsyncアルゴリズムを使用するため、すでに存在するデータにスペースを無駄にしないでください。
答え2
backup2l
1つのオプションは、たとえば、あらゆるレベルの差分バックアップと、必要な数のフルバックアップ用に設定できるバックアップツールを使用することです。backup2l
必要な頻度でcronjobとして実行し、confファイルのいくつかの値を設定して設定します。実際には、変更を見つけるためにハッシュを含むファイルのリストを保持し、状態を確認したり、日付ごとにファイルを復元する簡単な方法を提供するtarまたはafioを囲むラッパーです。
2番目のオプションはcvs
。自動コミット(および毎日のタグ付け)を実行するようにcronjobを設定します。 VCSの選択によっては、新しいファイルを追加したり古いファイルを削除したりするためにいくつかのスクリプトが必要になる場合があります。svn
git
30分間隔でvcsオプションを使用することをお勧めします。ただし、(または別のバックアップツール)を使用して2つのツールを組み合わせてbackup2l
vcsストレージをバックアップできます(バックアップの冗長性は常に良いです)。
答え3
アーカイブのファイルが変更されましたか、それとも新しいファイルが追加されましたか?
ファイルを変更せずにファイルのみを追加する場合は、以下を試してください。
tar ztf olddata.tar.gz | sort > tmpfile1
tar ztf newdata.tar.gz | sort > tmpfile2
diff tmpfile{1,2} > /dev/null
if test $? -eq 0
then
echo ignore newdata.tar.gz
else
echo keep olddata.tar.gz
fi
rm tmpfile{1,2}
v
tarディレクトリコマンドがありません。
同じコンテンツを含むアーカイブだけをスキップするには、v
次のようにミックスに追加します。
tar ztvf olddata.tar.gz | sort > tmpfile1
など。
答え4
だからこれを試してみてください:
OLDSUM=`tar zxOf olddata.tar.gz | md5sum | awk '{print $1}'`
NEWSUM=`tar zxOf newdata.tar.gz | md5sum | awk '{print $1}'`
if test "${NEWSUM}" != "${OLDSUM}"
then
echo save newdata.tar.gz
else
echo nothing changed
fi
CapitalはO
アーカイブコンテンツをstdout
。
ただし、ファイルがまったく同じ順序でアーカイブに追加されていない場合は機能しません(可能性があります)。