将各种大小文件的2TB编程打包到25GB的文件夹中?(我使用Python,任何语言都可以接受)



我有大约4,000个巨大尺寸的文件,我试图尽可能有效地备份。我知道将它们全部压缩到一个巨大的tarball中,然后均匀分裂是一个解决方案,但是当我使用Bluray Discs时,如果我刮擦一个部分,我可能会失去整个光盘的内容。

我写了一个Python脚本,将所有文件(加上它们的尺寸(放入数组中。我先获取最大的文件,然后添加下一个最大的文件(如果总数还小于25GB(,或者向下移动列表,直到我可以添加一个,直到我达到尺寸限制,然后从剩余的下一个文件。

这确实很好,但最终确实变得破烂了,我最终将使用15个光盘,而不是数学上所需的。

有人有我不知道的更好的方法吗?(这似乎是Google编码面试问题,哈哈(。我不需要它是完美的,我只想确保在跑到这个非廉价BD-RS的巨型堆栈之前,我不会愚蠢地做到这一点。我包括代码以供参考。

#!/usr/bin/env python3
import os
import sys
# Max size per disc
pmax = 25000000000
# Walk dir
walkdir = os.path.realpath(sys.argv[1])
flist = []
for root, directories, filenames in os.walk( walkdir ):
    for filename in filenames:
        f = os.path.join(root,filename)
        fsize = os.path.getsize(f)
        flist.append((fsize,f))
flist.sort()
flist.reverse()
running_total = 0
running_list = []
groups = []
while flist :
    for pair in flist :
        if running_total + pair[0] < pmax :
            running_list.append(pair[1])
            running_total = running_total + pair[0]
            flist.remove(pair)
    groups.append(l)
    running_list = []
    running_total = 0
print('This will take {} discs.'.format(len(groups)))

我只是通过访问列表,添加越来越小的文件来强迫它,直到我没有文件或填充磁盘,然后重复。通过"数学上需要",我只是指所有文件的大小/25GB =圆盘的理想#。我可以在

上将结果阵列发布

最新更新