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

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

《软件&网站架构师手记》之一_用Python脚本补充Linux命令的不完善之二:

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

1、目录位置;

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

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

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


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

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

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


脚本(代码)如下:

#!/use/bin/env python
#-*- coding:utf-8 -*-


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")
#sys.argv[1]="/www"
#sys.argv[2]="cknow.net"
print("下面这个Demo数据仅仅为了测试方便,完全可以忽略……请您(使用者)重新输入参数就OK了!")
search("/www", "cknow.net")     #这个Demo数据仅仅为了测试方便,完全可以删除,删除后让使用者重新输入参数就OK了!
else:

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


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

后记:

--

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

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

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

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

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




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