前言
最近手头的一个小需求,正好在学习Python就使用Python脚本来制作,如下~
我的脚本都是我经过测试可用的,如有问题,欢迎各位大佬提出,小白一定积极改进,感谢
需求
1.获得一个tar包,放到指定路径解压
2.对解压后的文件夹进行遍历,找出.cpp文件
3.在.cpp文件中,查找是否存在指定关键词
完成以上3点后,可以根据需求不同更改脚本,如寻找不同的文件、增删关键词、对存在关键词的文件进行后续操作。
脚本
import os
import sys
import tarfile
import shutil
def filelist_Sizer(path,sizer1,sizer2,keyword):
dirlist = []
filelist = []
for dirpath, dirnames, filenames in os.walk(path):
for name in filenames:
dirlist.append(os.path.join(dirpath,name))
for file in dirlist:
if file.endswith(key2):
with open(file,'r',encoding='utf-8') as fr:
for key in keyword:
if key in fr.read():
filelist.append(file)
return filelist
def uncompress(dstpath,filepath):
filename=os.path.basename(filepath)
dstpath = dstpath + '/' + filename
shutil.copyfile(filepath,dstpath)
os.chdir(os.path.dirname(dstpath))
tar=tarfile.open(filename,'r')
tar.extractall()
tar.close()
key1='.cpp'
#key2='.c'
key2='.sh'
keyword=[]
keyword.append('if')
keyword.append('and')
#filepath = sys.argv[1] # 也可以进行传参的方式,这里指定路径进行测试
filepath = '/scratch/ywang/learn/python/tarfile/test.tar.gz'
dstpath = '/tools/workspace'
uncompress(dstpath,filepath)
filelist=filelist_Sizer(dstpath,key1,key2,keyword)
print(filelist)
if len(filelist) == 0:
finishflag = True
os.popen(f'rm -rf {dstpath}/*')
else:
finishflag = False
print('There are %s files containing keywords, please check the following path: %s !!' %(len(filelist),dstpath))
分析
filelist_Sizer 函数:筛选文件格式,并对符合条件的文件,寻找关键词
uncompress 函数:解压该文件,并将文件复制到工作路径进行后续操作
对序列keyword进行增删即可操作关键词
finishflag 为后续操作铺垫,比如我打算后续结合jenkins,寻出关键词的则以失败退出本次任务
后续
我已经接入Jenkins
可将脚本最后的一部分内容更改为
if len(filelist) == 0:
finishflag = True
os.popen(f'rm -rf {dstpath}/*')
print('The traversal check has passed')
sys.exit(0)
else:
finishflag = False
print('There are %s files containing keywords, please check the following path: %s !!' %(len(filelist),dstpath))
print(filelist)
sys.exit(1)
如图所示,即可在jenkins中也是shell中调用该脚本,并为当存在关键字时,jenkins以失败退出,否则继续下面的Build操作。
这个方法,我个人是不推荐Leader的,早前就建议过,我感觉遍历查关键字实在浪费时间,不过leader执意要求,就当作学习了,正好在学习python,就用了python来实现,而没有使用shell
平时工作中有能够使用脚本实现的工作,我都会尽量制作,当作学习和熟练使用脚本~
加油!