LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 694|回复: 0

一个文件分割脚本,请多多指教

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

本版积分规则

快速回复 返回顶部 返回列表