|
- 1 #!/usr/bin/python
- 2 # -*- encoding: utf-8 -*-
- 3
- 4 # Author: 周鹏
- 5 # Date: 2006-07-07
- 6
- 7 import os
- 8 import sys
- 9 import getopt
- 10 import shutil
- 11 import math
- 12
- 13 """此程序用来分割文件,由参数指定文件名及单位块大小,程序自动计算所需数量
- 14 分割文件存放在 $filename.split 目录中
- 15 然后可用如下方法重新组装:
- 16 find $filename.split/* | sort | xargs -i cat {} >$new_filename
- 17 $new_filename 最好不要在 $filename.split 目录中
- 18 """
- 19
- 20 def split(fname, slice, unit, mode):
- 21 if unit in ['m', 'M']:
- 22 dd_unit = unit.upper()
- 23 else:
- 24 dd_unit = unit.lower()
- 25 du_unit = unit.lower()
- 26
- 27 # 先检测文件是否存在及是否是普通文件
- 28 if not os.path.isfile(fname):
- 29 strerr = 'Not a regular file.'
- 30 sys.stderr.write('%s\n' % strerr)
- 31 sys.exit(1)
- 32
- 33 store = fname + '.split'
- 34 if not os.path.exists(store):
- 35 os.mkdir(store)
- 36 elif mode == 1:
- 37 shutil.rmtree(store)
- 38 os.mkdir(store)
- 39 else:
- 40 strerr = 'File or directory exists.'
- 41 sys.stderr.write('%s\n' % strerr)
- 42 return 0
- 43 bname = os.path.basename(fname)
- 44
- 45 temp = os.popen('du %s -%s' % (fname, du_unit)).read().split()
- 46 if temp:
- 47 fsize = int(temp[0])
- 48 amount = fsize / slice
- 49 if fsize % slice > 0: amount += 1
- 50 ndigit = int(math.log10(amount)) + 1
- 51 for i in range(amount):
- 52 s = '%%0%sd' % ndigit
- 53 exec "n = '%s' %% %s" % (s, i)
- 54 target = '%s/%s.%s' % (store, bname, n)
- 55 pid = os.fork()
- 56 if pid == 0:
- 57 os.execlp(
- 58 'dd', 'dd', 'if=%s' % fname, 'of=%s' % target,
- 59 'bs=%s%s' % (slice, unit), 'skip=%d' % i, 'count=1'
- 60 )
- 61 assert 0, "Excuting dd failed."
- 62 else:
- 63 os.wait()
- 64 return 1
- 65 else:
- 66 return 0
- 67
- 68 def main(argv=sys.argv):
- 69 try:
- 70 opts, args = getopt.getopt(argv[1:], 'u:fh', ['force', 'help'])
- 71
- 72 unit = 'M'
- 73 slice = 9
- 74 mode = 0 # force or not
- 75
- 76 if not args:
- 77 strerr = 'No filename given.'
- 78 sys.stderr.write('%s\n' % strerr)
- 79 print usage
- 80 sys.exit(1)
- 81
- 82 fname = args[0]
- 83
- 84 for opt, value in opts:
- 85 if opt in ['-u']:
- 86 unit = value[-1]
- 87 if unit not in ['b', 'B', 'k', 'K', 'm', 'M']:
- 88 strerr = 'Not a valid unit.'
- 89 sys.stderr.write('%s\n' % strerr)
- 90 sys.exit(1)
- 91 slice = value[:-1]
- 92 if slice.isdigit():
- 93 slice = int(slice)
- 94 else:
- 95 strerr = 'Not a valid value.'
- 96 sys.strerr.write('%s\n' % strerr)
- 97 sys.exit(1)
- 98 elif opt in ['-f', '--force']:
- 99 mode = 1
- 100 elif opt in ['-h', '--help']:
- 101 print usage
- 102 sys.exit(0)
- 103
- 104 if not split(fname, slice, unit, mode):
- 105 strerr = 'File spliting failed.'
- 106 sys.stderr.write('%s\n' % strerr)
- 107 sys.exit(127)
- 108
- 109 except getopt.GetoptError, goEx:
- 110 strerr = 'getopt error: %s, %s' % (goEx.opt, goEx.msg)
- 111 sys.stderr.write('%s\n' % strerr)
- 112 sys.exit(1)
- 113
- 114 if __name__ == '__main__':
- 115 program = os.path.basename(sys.argv[0])
- 116 usage = """program usage: %s [OPTIONS] FILENAME
- 117 OPTIONS:
- 118 -u $unit, 每个分割文件的大小:b, k, m...
- 119 -f|--force, force,如果 $filename.split 存在就先删除
- 120 -h|--help, print this message
- 121 """ % program
- 122 main()
- 123 else:
- 124 usage = "module usage %s " % __name__
复制代码 |
|