您的位置:首页 > 运维架构 > Linux

用Python遍历(Linux)的子目录并且查找出指定的字符串带(扩展名)黑白名单功能

2014-09-10 11:57 453 查看
《软件&网站架构师手记》之一_用Python脚本补充Linux命令的不完善之二:

用Python脚本遍历(Linux)的子目录(或文件夹)并且查找出指定的字符串,并且显示:

1、目录位置;

2、(字符串)所在的文件名;

3、字符串所在(文件中)的行号;

4、以及显示本行信息,既显示本行的(从本行开始)的256个字符。



#并且支持把扩展名放进脚本中 用数组存放的黑、白(扩展名)名单中:

既先在“白扩展名”类型的文件当中:检索,如*.txt, *.log, *.cnf, *.conf, *.php 等(类型)文件中包含的,找出来……

然后再查一遍“黑扩展名”中不包括的,既:不包括  *.myd , *.jpg, *.bmp, *. rar, *.class 等的文件,遍历查找一遍……



脚本(代码)如下:

import sys,os

filte1Type = ['conf','cnf','php','txt','log'] #,'log']         #白名单

filterType = ['MYD','myd','gif','png','bmp','jpg','jpeg','rar','zip',   ##黑名单

   'ico','apk','ipa','doc','docx','xls','jar',

   'xlsx','ppt','pptx','pdf','gz','pyc','class']

num = 0

def search(path=None,cont=None):

 if not path or not cont:

  print('path or searchString is empty')

  return

 global num

 print("\r\n[在白名单(扩展名)文件中查找-- Find in [whitename] file!:")

 _loopFolde1r(path,cont) 

 print("%s file find" % num)

 print("\r[在白名单(扩展名)文件中找到:%s个\r\n" % num)

        print("\r\n")

 print("\r\n[在刨除黑名单(扩展名)的文件中查找-- Find in [!Blackname!] file!!:")

 _loopFolde2r(path,cont)

 print("\r\n[刨除 黑名单(扩展名)文件的数量:%s" % num)

def _loopFolde1r(path,cont): #此过程(函数)用来只检查扩展名为白名单的

 arr = path.split('/')

 if not arr[-1].startswith('.'): #不检查隐藏文件夹

  if os.path.isdir(path):

   folderList = os.listdir(path)

   for x in folderList:

    _loopFolde1r(path+"/"+x,cont)

  elif os.path.isfile(path):

                        if path.split('.')[-1].lower() in filte1Type:

                                _verifyContent(path,cont)

def _loopFolde2r(path,cont): #此过程只检查(扩展名)不包含黑名单的

 arr = path.split('/')

 if not arr[-1].startswith('.'): #不检查隐藏文件夹

  if os.path.isdir(path):

   folderList = os.listdir(path)

   for x in folderList:

    _loopFolde2r(path+"/"+x,cont)

  elif os.path.isfile(path):

                        if not(path.split('.')[-1].lower() in filterType):

                                _verifyContent(path,cont)                 

def _verifyContent(path,cont):

# if path.split('.')[-1].lower() in filterType:

#  return

 global num

 fh = open(path,'r')

 fhContent = fh.readlines()

 fh.close()

 for index,x in enumerate(fhContent):

  if cont in x:

   num += 1

   print("%s    %s" % (path,index+1))

   print("%s " % x[1:256])

   break

 return

if __name__ == "__main__":

 if len(sys.argv) < 3:

  print("invalid parameters")

  print("下面这个Demo数据仅仅为了测试方便,完全可以忽略……请您(使用者)重新输入参数就OK了!")

  search("/www", "cknow.net")     #这个Demo数据仅仅为了测试方便,完全可以删除,删除后让使用者重新输入参数就OK了!

 else:

  search(sys.argv[1],sys.argv[2])

----------------------------------------------

后记:

--

Python(写的)脚本真是简洁!

但放到csdn来 Python的“缩进”全乱…… 所以我认为这是Python唯一“讨厌”的地方……

在学习解决办法中……!!

为显示缩进情况,拷屏 了一部分代码的显示……

文章中代码是完整的,只是Python代码中的“缩进”被 csdn的文章发布系统“吃掉”了!?



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐