2010-05-26 94 views
0

我想构建一个小型的python脚本,它基本上与grep相反。 我想匹配没有“searled_string”的目录/子目录中的文件。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”扩展,并且将它们输出全通路上市everyfiles。

我现在想知道如何做剩下的事情,例如我希望能够在一个文件中忘记会话管理条目(允许任何人直接访问文件)搜索: “if( !user.hasPermission”,并列出不包含此字符串的文件。

任何帮助将不胜感激!

感谢

+4

你可能想看看-l,-L,和grep -v的选项。 -v反转匹配(即打印行不符合模式)。 -l列出包含与该模式匹配的行的文件,-L列出不包含该模式的文件。 – jkasnicki 2010-05-26 04:47:10

+0

查看os.path.splitext处理文件扩展名。 (http://docs.python.org/library/os.path.html#os.path.splitext) – gimel 2010-05-26 04:52:02

回答

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) 

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

+0

感谢Alex的解释! 不幸的是我有一些问题,运行此: test.py:22:警告:“与”将成为一个Python保留关键字2.6 然后,我python2.6的运行它,并得到另一个错误: 文件“test.py”,第18行,在 如果s在f.read(): AttributeError的:“海峡”对象有没有属性“读” 感谢 – thomytheyon 2010-05-26 05:29:55

+0

没有更多的错误,但不返回任何东西:( – thomytheyon 2010-05-26 06:03:05

+0

对不起,错误,固定(tx @ johnsy)。@thomy,我使用'print'而不是'return',当然你可以编辑它以执行完全的无论在哪种情况下,都需要使用它们。 – 2010-05-26 14:07:07

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))