背景:
最近在整理以前的老照片,也买了一个刻录机,想将以前的老照片刻录成光盘做一个备份。
但是碰到一个问题,老照片有几百GB,每张光盘只能存4.7 GB,就需要将文件夹进行分割。
刻录软件分割会将同一个文件数据切分到不同光盘。
想到用压缩软件,分卷压缩,指定卷大小,但是这个方法有问题:
A:光盘上的文件没法直接浏览。
B:最终会刻录几十张盘,如果有一张损坏或者遗失,整个数据就会丢失。
网上找了 Folder Axe,可以将文件夹按大小切分,但是他将文件整体平铺切分到指定目录下,没有保留原文件路径信息。
找了半天,没办法,只好自己用python写了一个工具来切分文件夹,满足如下功能:
1:可以指定切分后文件夹大小,保证切分后每个文件夹小于等于指定大小。
2:保留原目录结构(备注:一个子文件夹可能会被切分到多个目标文件夹下)。
用法:
python filesplit.py 源文件夹 目标文件夹 大小(单位 GB,4.7GB则输入 4.7)
import os
import shutil
import sys
import os
g_src_dir = ''
g_dst_dir = ''
g_folder_index = 0
g_cd_size = 4.7
g_sum_size = 0
def SplitFolder(src_dir_name):
try:
ls=os.listdir(src_dir_name)
isexists=os.path.exists(g_dst_dir)
if not isExists:
os.makedirs(g_dst_dir)
except Exception as e :
print 'dir error.' repr(e)
else:
for fn in ls:
tempfile=os.path.join(src_dir_name,fn)
if (os.path.isdir(tempfile)):
SplitFolder(tempfile)
else:
temprealpth = tempfile[len(g_src_dir) 1:]
try:
size = os.path.getsize(tempfile)
global g_sum_size
if g_sum_size size > (g_cd_size -0.1)*1000*1000*1000 :
g_sum_size = 0
global g_folder_index
g_folder_index = g_folder_index 1
g_sum_size = g_sum_size size
dstpath = os.path.join(os.path.join(g_dst_dir,'cd' str(g_folder_index)),temprealpth)
(tempfilepath, tempfilename) = os.path.split(dstpath)
isExists = os.path.exists(tempfilepath)
if not isExists:
os.makedirs(tempfilepath)
print 'mv file:' tempfile ':' dstpath
cmd = 'cp -f "' tempfile '" "' dstpath '"'
cmdnew = cmd.replace('\\','\\\\')
#print cmdnew
#os.system (cmdnew)
shutil.copy2(tempfile, dstpath)
except Exception as e :
print 'error path:' tempfile
print 'error.' repr(e)
print('mv end!')
if __name__ == "__main__":
if len(sys.argv) < 3 :
print(" args < 3")
print 'sourcepath dstpath size(ex:4.7)'
exit()
g_src_dir = sys.argv[1]
g_dst_dir = sys.argv[2]
g_cd_size = float(sys.argv[3])
g_folder_index = 0
print 'sourcepath: ' g_src_dir
print 'dstpath: ' g_dst_dir
print 'size: ' str(g_cd_size)
SplitFolder(g_src_dir)
,