免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1567 | 回复: 0

最近寫了Backup, Search程序如果寫的不好,希望大家能夠教導我 [复制链接]

论坛徽章:
0
发表于 2012-11-23 00:35 |显示全部楼层
本帖最后由 dreamlearn 于 2012-11-23 00:48 编辑

Backup Program
有壓縮和解壓, 列出壓縮文件內容的功能
可以選擇bz或bz2壓縮或不壓縮
可以選擇忽略文件名 and 設定時間自動Backup
  1. #!/usr/bin/python3.2
  2. import time
  3. import shutil
  4. import fnmatch
  5. import tarfile
  6. import os
  7. import re
  8. backupname = 'backup'+time.strftime('%Y-%m-%d-%H')

  9. def ignore_patterns(*patterns):
  10.     def _ignore_patterns(path, names):
  11.         ignore_names = [ ]
  12.         for pattern in patterns:
  13.             print(pattern)
  14.             ignore_names.extend(fnmatch.filter(names, pattern))
  15.         return set(ignore_names)
  16.     return _ignore_patterns
  17.    
  18. def TarFiles(dirfrom, dirto=None, args=None):
  19.     global tar
  20.     keyword = ['-n', '--not', 'gz', 'bz2', '-d', '--decompress', '-l', '--list']
  21.     if [s for s in args if s not in ['-d', '--decompress', '-l', '--list']] :
  22.         if '-n' in args or '--not' in args:
  23.             tar_ext = ''
  24.             tar_mod = ''
  25.         elif 'bz2' in args or 'gz' in args:
  26.             if 'bz2' in args: t_mod = 'bz2'    # because args is tuple so use if to judge
  27.             else: t_mod = 'gz'
  28.             tar_ext = '.' + t_mod
  29.             tar_mod = ':' + t_mod
  30.         else:
  31.             tar_ext = '.' + 'bz2'  
  32.             tar_mod = ':' + 'bz2'
  33.         tar_name = '%s.tar%s' % (backupname, tar_ext)
  34.         path_to   = os.path.join(dirto, tar_name)
  35.         if not os.path.exists(path_to):
  36.             tar = tarfile.TarFile.open(path_to, 'w'+tar_mod)
  37.         names = os.listdir(dirfrom)
  38.         ig_names = [x for x in args if x not in keyword]
  39.         if ig_names:  
  40.             print(ig_names)
  41.             ignore = ignore_patterns(*ig_names)
  42.             ignore_name = ignore(dirfrom, names)
  43.         else:
  44.             ignore_name = set( )
  45.         for name in names:
  46.             if name in ignore_name:
  47.                 continue
  48.             srcname = os.path.join(dirfrom, name)
  49.             dstname = os.path.join(dirto,   name)
  50.             if os.path.isdir(srcname):
  51.                 TarFiles(srcname, dirto, args)
  52.                 if not os.listdir(srcname):
  53.                     tar.add(srcname)
  54.             else:
  55.                 tar.add(srcname)
  56.             
  57.     if '-d' in args or '--decompress' in args:
  58.         try:
  59.             de_tar = tarfile.TarFile.open(dirfrom, 'r')
  60.             names  = de_tar.getnames( )
  61.             for name in names:
  62.                 de_tar.extract(name, dirto)
  63.                 de_tar.close( )
  64.         except:
  65.             print(sys.exc_info()[0], '\n%s' % sys.exc_info()[1])
  66.     if '-l' in args or '--list' in args:
  67.         tar = tarfile.TarFile.open(dirfrom)
  68.         print(tar.list( ))
  69.         tar.close( )
  70.    
  71. def Backup(dirfrom, dirto, *args):
  72.     for oldbackup in os.listdir(dirto):
  73.         find = re.search(r'\bbackup\d+-\d+-\d+-\d+-', oldbackup)
  74.         if find:
  75.             rmpath = os.path.join(dirto, oldbackup)
  76.             if os.path.isdir(rmpath): os.remove(rmpath)
  77.             else: shutil.rmtree(rmpath)
  78.     path_to = os.path.join(dirto, backupname)
  79.     TarFiles(dirfrom, dirto, args)

  80. def AutoBackup(dirfrom, dirto, *args):
  81.     timer   = [x for x in args if '-t' and '--time' in x][0]  
  82.     if timer:
  83.         timer   = timer[-5:]
  84.     flags   = 1
  85.     retimer = 0  
  86.     while True:
  87.         if timer == time.strftime('%H:%M') and flags:
  88.             TarFiles(dirfrom, dirto, args)
  89.             if '-o' in args or '--one' in args: break   
  90.             flags = 0
  91.             h = timer[:2]
  92.             if timer[3] == '0':
  93.                 t = int(timer[3]) + 1
  94.                 m = int(timer[4]) + 1
  95.                 m = str(m)
  96.                 retimer = h + ':' + str(t) + m[-1]
  97.             else:
  98.                 m = int(timer[3:]) + 1   
  99.                 if m == 60: m = '00'
  100.                 retimer = h + ':' + str(m)
  101.         if retimer == time.strftime('%H:%M'):
  102.             flags = 1
  103.         time.sleep(1)   

  104. if __name__ == '__main__':
  105.     Backup('/home/jack/python', '/home/jack/desktop', '*.py', '*.txt')
  106.     tar.close( )  

  107. '''
  108.     print(J-Backup 1.0
  109. 1. Compress Files/Directorys')
  110. 2. Backup directorys
  111. 3. Auto-backup  
  112. 4. Helps
  113. 5. Exit
  114. )

  115.     def Main():
  116.         try:
  117.             print(Option)
  118.             opt = input('>')
  119.         except:
  120.             print(Error includes only intege option!)
  121.         if opt == 1:
  122.             TarFiles(
  123. '''
复制代码
Search program
有顯示文件大小 and 顯示所有經過的文件路徑的功能
有通配符搜索,忽略大小寫,可以指明只搜索dir or file
也可以計算dir, file 數量, 還有可以跟據file 的修改時間去搜索
  1. #!/usr/bin/python3.2
  2. import os
  3. import sys
  4. import fnmatch
  5. import time
  6. import math

  7. class Search(object):
  8.     fcount   = dcount = 0
  9.     maxdepth = 0
  10.     result   = [ ]
  11.     errors   = [ ]
  12.     def __init__(self, names, args=[]):
  13.         # Check if defalut arg not in args will extend in args
  14.         self.names = names
  15.         self.args  = args
  16.    
  17.     def search(self, path):
  18.         ignore   = False
  19.         srcfiles = files = os.listdir(path)
  20.         # ignore case mode so upper all file names, search names
  21.         if 'i' in self.args or '--ignore' in self.args:
  22.             ignore = True
  23.             files  = [f.upper( ) for f in files]   
  24.             self.names  = [n.upper( ) for n in self.names]
  25.         searchname = self._match_return_names(self.names)
  26.         filenames  = searchname(path, files)
  27.         for file in srcfiles:
  28.             srcname = os.path.join(path, file)
  29.             # Dicition whether subdir if True into subdir
  30.             if os.path.isdir(srcname):
  31.                 self.dcount += 1
  32.                 self.search(srcname)
  33.             else:
  34.                 self.fcount += 1
  35.             if ignore:
  36.                 file = file.upper( )
  37.             if 'v' in self.args or '--verbose' in self.args:
  38.                 self._tryprint(srcname)
  39.             '''
  40.             if 'm' in self.args or '--maxdepth' in self.args:
  41.                 depth = args.index()
  42.             '''
  43.             if file in filenames:
  44.                 if 's' in self.args or '--size' in self.args:
  45.                     srcname = self._get_size(srcname) + ' ' + srcname
  46.                 if 'f' in self.args  or '--file' in self.args\
  47.                     and os.path.isfile(srcname):
  48.                         continue
  49.                 elif 'd' in self.args or '--dir' in self.args\
  50.                     and os.path.isdir(srcname) :
  51.                         continue
  52.                 self.result.append(srcname)  
  53.         if 'c' in self.args or '--count' in self.args:
  54.             return self.result, self.fcount, self.dcount
  55.         else:
  56.             return self.result  
  57.          
  58.     def _match_return_names(self, patterns):
  59.         def __match_return_names(path, files):
  60.             result = [ ]
  61.             for pattern in patterns:
  62.                 result.extend(fnmatch.filter(files, pattern))
  63.             return result
  64.         return __match_return_names            

  65.     def _tryprint(self, arg):
  66.         try:
  67.             print(arg)
  68.         except UnicodeEncodeError:
  69.             print(arg.encode('utf-16'))
  70.    
  71.     def _get_size(self, srcname):
  72.         lst = ['Bytes', 'KB     ', 'MB     ', 'GB     ', 'TB     ', 'PB     ']
  73.         try:
  74.             bytes = os.path.getsize(srcname)
  75.         except OSError:
  76.             return ('Error this file maybe Damage or not exists!\nNone')
  77.         if bytes == 0:
  78.             return ('0.00' + ' ' + lst[0])
  79.         else:
  80.             i = int(math.log(bytes, 1024))
  81.             return ('%.3f' + ' ' + lst[i]) % (bytes / 1024 ** i)


  82. class Modify_Search(Search):
  83.     tmp = [ ]
  84.     def __init__(self, time_mod, times, names=None, args=[]):
  85.         Search.__init__(self, names, args)
  86.         self.time_mod = time_mod
  87.         self.times    = times * 60
  88.     def modify_search(self, path) :
  89.         search_time = time.time( ) - self.times
  90.         files  = os.listdir(path)
  91.         for file in files:
  92.             srcname = os.path.join(path, file)
  93.             try:
  94.                 m_time  = os.path.getmtime(srcname)
  95.             except OSError:
  96.                 m_time = 0
  97.             if os.path.isdir(srcname):
  98.                 self.modify_search(srcname)  
  99.             if self.time_mod == '--cmin':
  100.                 if self.names is not None:
  101.                     self.tmp.append(self.search(path))
  102.                     if srcname in tmp\
  103.                         and m_time > search_time:
  104.                             self.result.append(srcname)
  105.                 else:
  106.                     if m_time > search_time:
  107.                         self.result.append(srcname)  
  108.         return self.result

  109. if __name__ == '__main__':
  110.     modify = Modify_Search('--cmin', 1)
  111.     search = modify.modify_search('/home/jack')
  112.     for s in search:
  113.         print(s)  
  114.     '''
  115.     start  = time.clock( )  
  116.     search = Search(['text'], ['--ignore', '--count', '--size', '--dir'])
  117.     print(search.search('/home/jack'))
  118.    
  119.     finish = time.clock( ) - start
  120.     if len(result) > 2:
  121.         retult, fcount, dcount = result
  122.         fcount = 'Files: %i'     % fcount
  123.         dcount = 'Directors: %i' % dcount
  124.     else:         
  125.         fcount = dcount = '-' * 12
  126.     print('RESULT:--------Finished at %.3f--------%s--%s\n' % (finish, fcount, dcount))
  127.     for r in result[0]:
  128.         search._tryprint(r)
  129.     '''
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP