python grep обратное соответствие - PullRequest
0 голосов
/ 26 мая 2010

Я хотел бы создать небольшой скрипт на python, который по сути делает все наоборот. Я хочу сопоставить файлы в каталоге / подкаталоге, который не имеет "искомой_строки".

Пока я это сделал:

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 ]

1 голос
/ 26 мая 2010

Чтобы проверить, содержит ли файл с путем, связанным с переменной 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 голосов
/ 26 мая 2010

Вместо печати имени файла вызывается функция, которая проверяет, не совпадает ли содержимое файла с текстами, которые вы хотите иметь в исходных файлах. В таких случаях я использую 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))
...