LinuxSir.cn,穿越时空的Linuxsir!

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

一个 python 小脚本 —— 判断文件是否被 slackware 包管理

[复制链接]
发表于 2009-7-27 22:28:59 | 显示全部楼层 |阅读模式
将文件在 PATH 下保存成 slackfiles.py 并 chmod +x 就好~ 其实这个 python 脚本功能很单一,关键是要和 shell 脚本联动~
这里给几个常用的用法:
# 在 "/var/tmp/slackfile/db.pkl" 建立数据库
tail -n+19 /var/log/packages/* | slackfiles.py --creat-db
# 在 ~/db 建立数据库
tail -n+19 /var/log/packages/* | slackfiles.py --creat-db ~/db
# 根据数据库 "/var/tmp/slackfile/db.pkl" 在 /usr/lib64 下面找没有被包管理的文件
cd /
find usr/lib64 -type f | slackfiles.py
# 根据数据库 ~/db 在 /usr/lib64 下面找没有被包管理的文件
cd /
find usr/lib64 -type f | slackfiles.py --use-db ~/db
# 以上方法都没有考虑链接

欢迎提意见,拍砖~;)

源码:

  1. #!/usr/bin/env python
  2. import sys, cPickle
  3. import os

  4. def_db = "/var/tmp/slackfile/db.pkl"

  5. def print_help(outfile=sys.stdout):
  6.         outfile.write(
  7. '''slackfiles.py [--use-db <db-name> | [--creat-db | --add-db] [db-name]]

  8. If no arguments, it eqauls to "slackfile.py --use-db /var/tmp/slackfile/db.pkl"
  9. Default database name is "/var/tmp/slackfile/db.pkl"
  10. ''')

  11. def check_dir(name):
  12.         if not os.path.isdir(name):
  13.                 try:
  14.                         os.makedirs(name)
  15.                 except:
  16.                         sys.stderr.write('Could not make dir: ' + name + '\n')

  17. def load_set(name):
  18.         try:
  19.                 return cPickle.load(open(name, 'rb'))
  20.         except IOError:
  21.                 sys.stderr.write(name + 'does not exist or \
  22.                                 you don\'t have a read permission.\n\
  23.                                 Please creat the datebase first\n')
  24.                 sys.exit(1)


  25. def build_set(se, infile):
  26.         for i in infile:
  27.                 se.add(i)

  28. def build_db(filename, instream=sys.stdin, add=False):
  29.         check_dir(os.path.split(filename)[0])

  30.         if add == False:
  31.                 se = set()
  32.         else:
  33.                 se = load_set(filename)
  34.         build_set(se, instream)

  35.         try:
  36.                 dbfile = open(filename, 'wb')
  37.         except IOError:
  38.                 sys.stderr.write('Could not write to ' + filename + '\n')
  39.                 sys.exit(1)
  40.         cPickle.dump(se, dbfile, -1)
  41.         dbfile.close()

  42. def search_set(se, infile):
  43.         for i in infile:
  44.                 if i not in se:
  45.                         print i[:-1] # strip one trailing \n manually.

  46. def search_db(filename, instream=sys.stdin):
  47.         se = load_set(filename)
  48.         search_set(se, instream)

  49. def main(args):
  50.         i = 1    # skip the first arg(program name)
  51.         while i < len(args):
  52.                 if args[i] == '--use-db':
  53.                         if i + 1 > len(args):
  54.                                 print_help()
  55.                                 sys.stderr.write('\nPlease specify the database name.\n')
  56.                                 sys.exit(2)
  57.                         search_db(args[i + 1])
  58.                         sys.exit(0)
  59.                 elif args[i] == '--creat-db':
  60.                         if i + 1 < len(args):
  61.                                 name = args[i + 1]
  62.                         else:
  63.                                 name = def_db
  64.                         build_db(name)
  65.                         sys.exit(0)
  66.                 elif args[i] == '--add-db':
  67.                         if i + 1 < len(args):
  68.                                 name = args[i + 1]
  69.                         else:
  70.                                 name = def_db
  71.                         build_db(name, add=True)
  72.                         sys.exit(0)
  73.                 i += 1
  74.         search_db(def_db)

  75. if __name__ == '__main__':
  76.         main(sys.argv)
复制代码


不过需要注意的是根据创建数据库的方法不同,有的已经被包管理的文件可能会被误认为是没有被包管理,也可能被其他文件用到。删除文件时需慎重!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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