Grep, glob и find

grep glob i find Законченные системные программы

Если вы работаете в Unix-подобной системе, то наверняка знаете о существовании стандартного способа поиска строк в файлах в таких системах. Программа командной строки grep и родственные ей позволяют получить перечень всех строк в одном или нескольких файлах, содержащих строку или шаблон строки.[XXIII] Учитывая, что командные оболочки Unix автоматически расширяют (то есть «глобализуют») шаблоны имен файлов, такая команда, как приведена ниже, будет искать строку, указанную в командной строке, в файлах Python, расположенных в одном каталоге (в этом примере используется команда grep, входящая в состав облочки Cygwin для Windows, о которой я рассказывал в предыдущей главе):

C:\\PP4E\System\Filetools> c:\cygwin\bin\grep.exe walk *.py bigext-tree.py:for (thisDir, subsHere, filesHere) in os.walk(dirname): bigpy-path.py: for (thisDir, subsHere, filesHere) in os.walk(srcdir):

bigpy-tree.py:for (thisDir, subsHere, filesHere) in os.walk(dirname):

Как мы уже знаем, те же действия можно запрограммировать в сценарии на языке Python, организовав запуск такой команды с помощью os.system или os.popen. А в случае реализации операции поиска вручную, мы могли бы добиться похожих результатов с помощью модуля glob, с которым познакомились в главе 4, — он, подобно командной оболочке, расширяет шаблоны имен файлов в списки строк соответствующих имен файлов:

C:\\PP4E\System\Filetools> python

>>> import os

>>> for line in os.popen(r’c:\cygwin\bin\grep.exe walk *.py’):

print(line, end=’’)

bigext-tree.py:for (thisDir, subsHere, filesHere) in os.walk(dirname): bigpy-path.py: for (thisDir, subsHere, filesHere) in os.walk(srcdir):

bigpy-tree.py:for (thisDir, subsHere, filesHere) in os.walk(dirname):

>>> from glob import glob

>>> for filename in glob(‘*.py’):

if ‘walk’ in open(filename).read():

print(filename)

bigext-tree.py

bigpy-path.py bigpy-tree.py

К сожалению, область действия этих инструментов обычно ограничивается одним каталогом. Модуль glob способен выполнить обход нескольких каталогов при правильно сформированной строке шаблона, но он не является универсальным средством обхода деревьев каталогов, который требуется мне для обслуживания большого дерева каталогов с примерами. В Unix-подобных системах команда find оболочки предоставляет расширенные возможности для обхода всего дерева каталогов. Например, следующая команда Unix точно определила бы файлы и строки в текущем каталоге и ниже, где встречается строка popen:

find . -name “*.py” -print -exec fgrep popen {} \;

Если у вас имеется Unix-подобная команда find на всех компьютерах, которыми вы пользуетесь, можете считать, что у вас есть инструмент для обработки каталогов.

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Оцените статью
Секреты программирования
Добавить комментарий