在shell编程中有一组操作可以切分和合并大型文件,解决了因存储过小而不能在一个设备中存储的尴尬,命令是:
切分:
split -b 5m redhat6.5.iso redhat
-b 指定了每块子文件的大小 (适用于二进制文件
-l 指定了每个子文件的行数(适用于文本文件)
合并:
cat redhat* > redhat6.5.iso
如果你对shell 自带的切分合并操作不习惯,完全可以自己开发一套切分操作,我们这里命名为split.py。
split.py的内容如下所示:
#encoding:utf-8
#!/usr/bin/env python
#该程序将指定的大型文件切分成n个指定的小块(块的大小也可以指定)
import os
import sys
kilobytes = 1024
megabytes = kilobytes * 1024
chunksize = int(1.4 * megabytes)
def split(fromfile, todir, chunksize=chunksize):
#如果目标目录不存在则创建,否则删除原有的文件
if not os.path.exists(todir) :
os.mkdir(todir)
else :
for fname in os.listdir(todir) :
os.remove(os.path.join(todir, fname))
partnum = 0
inputfile = open(fromfile, 'rb')
#开始进行切分并且创建切分文件
while True :
chunk = inputfile.read(chunksize)
if not chunk :
break
partnum += 1
filename = os.path.join(todir, ('part%04d' % partnum))
fileobj = open(filename, 'wb')
fileobj.write(chunk)
fileobj.close()
print ("%s has been create." % (fileobj))
inputfile.close()
assert partnum <= 9999
return partnum
if __name__ == "__main__":
#首先进行参数检测
if len(sys.argv) == 2 and sys.argv[1] == '-help' :
print ('Use: split.py [file-to-split target-dir [chunksize]]')
else :
#用户将切分的源文件和目标地址没有进行参数传递,而是手动输入
if len(sys.argv) < 3 :
interactive = true
fromfile = raw_input('split file:')
todir = raw_input('directory to store part file:')
else :
interactive = False
fromfile, todir = sys.argv[1:3] #通过命令行参数传递
if len(sys.argv) == 4 :
chunksize = int(sys.argv[3])
absfrom, absto = map(os.path.abspath, [fromfile, todir])
print ('Splitting ', absfrom, ' to ', absto, ' by ', chunksize)
try :
parts = split(fromfile, todir, chunksize)
except :
print ('Error during split.')
print (sys.exc_info()[0], sys.exc_info()[1])
else :
print ('Split finished: ', parts, " parts are in ", absto)
if interactive :
input('Press Enter key')
split.py的参数最多有三个:
fromfile 要切分的大文件
todir 放置切分文件的目录
chunksize 每个切分文件的大小
使用命令操作如下:
python split.py /tools/redhat-enterprise6.5x86_64.iso /haha
可是这些碎片文件只有进行拼接才可以使用,关于碎片文件的合并在下一章节进行介绍。