Python 反向匹配 grep

0 投票
2 回答
1885 浏览
提问于 2025-04-15 23:10

我想写一个小的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)

(你无条件打印的内容)就是你想要打开并检查的路径。

撰写回答