2010-05-26 113 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))