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

来源:互联网 发布:广州婚纱摄影排名 知乎 编辑:程序博客网 时间:2024/06/13 08:26

《软件&网站架构师手记》之一_用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的文章发布系统“吃掉”了!?



0 0