Python 反向匹配 grep
我想写一个小的Python脚本,基本上是做grep的反向操作。也就是说,我想找出一个文件夹及其子文件夹中没有“搜索字符串”的文件。
到目前为止,我已经做到了这一点:
import os
filefilter = ['java','.jsp']
path= "/home/patate/code/project"
for path, subdirs, files in os.walk(path):
for name in files:
if name[-4:] in filefilter :
print os.path.join(path, name)
这个小脚本会列出每个子文件夹中所有扩展名为“java”或“jsp”的文件,并输出它们的完整路径。
现在我在想怎么继续,比如说如果我在某个文件中忘记了一个会话管理的条目(这会让任何人都能直接访问文件),我想搜索:“if (!user.hasPermission”,然后列出那些不包含这个字符串的文件。
任何帮助都会非常感谢!
谢谢
2 个回答
0
与其直接打印文件名,不如调用一个函数来检查文件内容是否和你想要的文本不匹配。在这种情况下,我会使用一个叫做 check_file()
的函数,它的样子是这样的:
WARNING_RX = (
(re.compile(r'if\s+\(!\s+user.hasPermission'), 'user.hasPermission'),
(re.compile(r'other regexp you want to have'), 'very important'),
)
def check_file(fn):
f = open(fn, 'r')
content = f.read()
f.close()
for rx, rx_desc in WARNING_RX:
if not rx.search(content):
print('%s: not found: %s' % (fn, rx_desc))
1
要检查一个路径为变量 f
的文件里是否包含一个名为 s
的字符串,最简单的方法(对于大多数合理大小的文件来说都可以)就是这样做:
with open(f) as fp:
if s in fp.read():
print '%s has the string' % f
else:
print '%s doesn't have the string' % f
在你的 os.walk
循环中,你会分别得到根路径和文件名,所以
f = os.path.join(path, name)
(你无条件打印的内容)就是你想要打开并检查的路径。