7

これがシナリオです。Python スクリプトを使用して、フォルダーの内容をバックアップできるようにしたいと考えています。ただし、バックアップを zip 形式 (おそらく bz2) で保存したいと考えています。

問題は、「現在の」フォルダーの内容が最新のバックアップの内容とまったく同じである場合、わざわざフォルダーをバックアップしたくないという事実から生じます。

私のプロセスは次のようになります。

  1. バックアップを開始する
  2. 「現在の」フォルダの内容を、最新の zip バックアップに保存されている内容と比較して確認します
  3. 同じ場合 – 「完了」</li>
  4. 異なる場合は、バックアップを実行してから「完了」</li>

ステップ2を完了するための最も信頼性が高く簡単な方法を誰かが推奨できますか? 比較を行うには、バックアップの内容を解凍して一時ディレクトリに保存する必要がありますか、それともより洗練された方法がありますか? おそらく変更された日付と関係がありますか?

4

4 に答える 4

6

ZipファイルにはCRC32チェックサムが含まれており、Python zipfileモジュール(http://docs.python.org/2/library/zipfile.html )を使用して読み取ることができます。ZipFile.infolist()から、CRCメンバーを含むZipInfoオブジェクトのリストを取得できます。ZipInfoオブジェクトには変更日もあります。

zipチェックサムを、解凍されたファイルの計算されたチェックサムと比較できます。解凍されたファイルを読み取る必要がありますが、すべてを解凍する必要はありません。

CRC32は暗号化チェックサムではありませんが、変更をチェックするだけで十分な場合があります。

これはzipファイルにも当てはまります。他のアーカイブ形式(tar.bz2など)には、このような簡単にアクセスできるメタデータが含まれていない場合があります。

于 2012-11-19T12:26:08.447 に答える
1

このスクリプトを使用して、最後のバックアップ後にディレクトリの内容が変更された場合にのみ、ディレクトリの圧縮バックアップを作成します。

外部のmd5ファイルを使用してバックアップファイルのダイジェストを保存し、それをチェックしてディレクトリの変更を検出します。

import hashlib
import tarfile
import bz2
import cStringIO
import os

def backup_dir(dirname, backup_path):
    fobj = cStringIO.StringIO()
    t = tarfile.open(mode='w',fileobj=fobj)
    t.add(dirname)
    t.close()
    buf = fobj.getvalue()
    new_md5 = hashlib.md5(buf).digest()

    if os.path.isfile(backup_path + '.md5'):
        old_md5 = open(backup_path + '.md5').read()
    else:
        old_md5 = ''

    if new_md5 <> old_md5:
        open(backup_path, 'wb').write(bz2.compress(buf))
        open(backup_path + '.md5', 'wb').write(new_md5)
        print 'backup done!'
    else:
        print 'nothing to do'
于 2012-11-19T15:25:45.263 に答える
1

Rsync は自動的に変更されたファイルを検出してコピーするだけですが、結果を bzip したいので、何か変更があったかどうかを検出する必要があります。

ディレクトリ リスト (タイム スタンプを含む) をアーカイブと一緒にテキスト ファイルに出力してみてはどうでしょうか。次回はdiff、この保存されたテキストに対して現在のディレクトリ構造を調べます。差分をgrepして、このファイルリストをパイプしてinclude、変更されたファイルにrsyncすることができます。

于 2012-11-19T09:56:29.240 に答える
1

You could also try the following process:

1) Initiate backup

2) Run backup

3) Compare both compressed files:

import filecmp
filecmp.cmp(Compressed_new_file, Compressed_old_file, shallow=True)

4) If same – delete new backup file then "complete"

5) Else “complete”</p>

NOTE: In case you need to check just the time between the modifications, you can have a look at this documentation

Rather than decompressing the folder and comparing individual files, I think it might be easier to compare the compressed files. Overall I feel (ok, its just an intuition :D) this will be better in case there is a high probability that the contents of the folder changes in between the times you run the script

于 2012-11-19T11:42:31.733 に答える