-1

ファイル ctime と mtime の差分バックアップを使用したいと考えています。ただし、ディクショナリの設定値は複数をサポートしていません。

fileInfo = {'/root/py/backup_tar/backup.log': [1382945505.0, 1382945505.0], '/root/py/backup_tar/fileinfo.pk': [1382943020.0, 1382943020.0], '/root/py/backup_tar/test.tar.gz': [1382945505.0, 1382945505.0], '/root/py/backup_tar/file_backup.py': [1382944678.0, 1382944678.0], '/root/py/backup_tar/tar.py': [1382693438.0, 1382693438.0], '/root/py/backup_tar/test.pk': [1382945505.0, 1382945505.0]}

old_fileInfo = {'/root/py/backup_tar/tar.py': [1382693438.0, 1382693438.0], '/root/py/backup_tar/file_backup.py': [1382944678.0, 1382944678.0], '/root/py/backup_tar/test.pk': [1382945487.0, 1382945487.0], '/root/py/backup_tar/fileinfo.pk': [1382943020.0, 1382943020.0], '/root/py/backup_tar/backup.log': [1382945377.0, 1382945377.0]}

difference = dict(set(fileInfo.items())^set(old_fileInfo.items()))
fileNum = len(difference)
print fileNum

difference_file = ' '.join(difference.keys())
print difference_file

これを解決する方法を知っている人はいますか?

4

2 に答える 2

1

手動でループするfileInfo必要があります。セットはここでは間違ったツールです。セット操作を使用するディクショナリ ビューで「不足している」アイテムを見つけることができます。

# all items in fileInfo that are not in old_fileInfo
to_backup = fileInfo.viewkeys() - old_fileInfo

# find changed, all items in fileInfo that *are* in old_fileInfo
for f in fileInfo.viewkeys() & old_fileInfo:
    ctime, mtime = fileInfo[f]
    old_ctime, old_mtime = old_fileInfo[f]
    if ctime != old_ctime or mtime != old_mtime:
        to_backup.add(f)

これにより、バックアップする一連のファイル名が作成されます。

Python 3 では、fileInfo.keys()代わりに を使用しfileInfo.dictkeys()ます。Python 2.6 以前では、set(fileInfo)代わりに を使用しfileInfo.dictkeys()ます。

デモ:

>>> fileInfo = {'/root/py/backup_tar/backup.log': [1382945505.0, 1382945505.0], '/root/py/backup_tar/fileinfo.pk': [1382943020.0, 1382943020.0], '/root/py/backup_tar/test.tar.gz': [1382945505.0, 1382945505.0], '/root/py/backup_tar/file_backup.py': [1382944678.0, 1382944678.0], '/root/py/backup_tar/tar.py': [1382693438.0, 1382693438.0], '/root/py/backup_tar/test.pk': [1382945505.0, 1382945505.0]}
>>> old_fileInfo = {'/root/py/backup_tar/tar.py': [1382693438.0, 1382693438.0], '/root/py/backup_tar/file_backup.py': [1382944678.0, 1382944678.0], '/root/py/backup_tar/test.pk': [1382945487.0, 1382945487.0], '/root/py/backup_tar/fileinfo.pk': [1382943020.0, 1382943020.0], '/root/py/backup_tar/backup.log': [1382945377.0, 1382945377.0]}
>>> to_backup = fileInfo.viewkeys() - old_fileInfo
>>> for f in fileInfo.viewkeys() & old_fileInfo:
...     ctime, mtime = fileInfo[f]
...     old_ctime, old_mtime = old_fileInfo[f]
...     if ctime != old_ctime or mtime != old_mtime:
...         to_backup.add(f)
... 
>>> to_backup
set(['/root/py/backup_tar/backup.log', '/root/py/backup_tar/test.tar.gz', '/root/py/backup_tar/test.pk'])
于 2013-10-28T07:44:36.747 に答える
0

正確に何がうまくいかないのかを教えてくれないので、あなたが何を望んでいるのかわかりません(スタックトレースを取得しますか?それから教えてください...)が、あなたの質問から、リストを次のように置き換えるだけでよいと想像できますタプル。したがって、(1382693438.0, 1382693438.0)代わりに[1382693438.0, 1382693438.0].

于 2013-10-28T07:39:58.240 に答える