1

我目前正在研究备份解决方案,一旦文件同步,我还想列出文件/目录(它们的权限/uid/gid)列表并将其保存在某处。

目前我有一个备份“快照”,它有 4105 个文件和 574 个目录,我正在使用 python 遍历备份快照并获取这些信息,它工作得很好,但这里有一个问题。

首先,我想获取所有这些信息并将其写入一个文件,最后它的大小为 170MB。不太好。

然后我决定根据每个目录拆分信息并将其写下来,我最终得到了 106MB 的磁盘使用量。

脚本 os.walks() 并将目录信息保存在一个列表中,然后对文件执行相同操作。两个列表组合在一个字典中,然后根据大小进行 JSON 编码并以小文件的形式写入磁盘。

我想知道您是否有建议如何减少磁盘使用量?

我还没有尝试将 SQLite 作为存储引擎来记录这些信息,也没有尝试使用 MySQL,最终可能会以几 GB 的数据库大小结束。

感谢您的建议和帮助,代码只是为了感受一下我在使用什么。

这是我正在使用的完成这项工作的脚本:

import os, sys
import json

zdir = {}
filestat=[]
dirstat=[]
for path, dirs, files in os.walk("/backup/us-s01",  followlinks=None):
        try:
                # Store files in the directory
                for file in files:
                        #print  os.path.join(path, file) 
                        st = os.stat( os.path.join( path, file ) )
                        file_stat = {
                                                        'name': file, 
                                                        'perm': oct( st.st_mode )[-4::],
                                                        'uid': st.st_uid,
                                                        'gid': st.st_gid,
                                                        'size': st.st_size
                                                        }
                        filestat.append( file_stat )

                # Store directory in 
                for di in dirs:
                        std = os.stat( os.path.join( path, di ) )
                        di_stat = { 
                                                'name': di,
                                                'perm': oct(std.st_mode)[-4::],
                                                'uid': std.st_uid,
                                                'gid': std.st_gid,
                                                'size': std.st_size
                                        }
                        dirstat.append( di_stat  )
                pa = path.replace('/', '-')
                zdir = { 'files':filestat, 'dirs':dirstat}
                f = open( '/root/test/json'+pa+'dat', 'w')
                f.write( json.dumps(zdir, separators=(',',':')) )
                f.close()

        except OSError:
                pass
4

1 回答 1

1

您可以只使用 gunzip 输出:

import gzip

# your code as posted

zdir = { 'files':filestat, 'dirs':dirstat}
string_out = json.dumps(zdir, separators=(',',':'))    
f = gzip.open( '/root/test/json'+pa+'gz', 'wb')
f.write(string_out)

我对此进行了测试,发现与将字符串写入文本文件相比,它可以将输出压缩到磁盘使用量的 10%。

于 2012-10-02T06:51:18.460 回答