1.11. Поиск всей документации к программе

Проблема
Требуется найти все файлы README и H0WT0, все журналы изменений, руко водства, примеры и прочую документацию, прилагаемую к установленной программе.
Решение
Воспользуйтесь finddoc — замечательным сценарием Python, любезно предостав ленным замечательной Акканой Пек.
1.11. Поиск всей документации к программе 29
Имя сценария может быть произвольным. Не забудьте разрешить его испол нение:
$chmod +x finddoc
В командной строке указывается только имя сценария и название программы,
для которой ищется документация. Пример:
$ ./finddoc grep
/usr/share/doc/grep
/usr/share/doc/grep-dctrl
/usr/share/doc/grep-dctrl.changelog.gz
Выходные данные фильтруются другими командами или направляются в файл:
$ ./finddoc | grep -i examples |lpr
$ ./finddoc | grep -i faq
$ ./finddoc j grep -1 examples > python-examples.txt
Листинг 1.1. Программа finddoc
#!/usr/bin/env python
# Finddoc: Сценарий для поиска документации Linux-программ.
# При создании собственной копии сценария обязательно сохраните
# начальные пробелы в том виде, в котором они приводятся в тексте.
# потому что они необходимы для работы Python.
# Поиск документации по заданным строкам, без учета регистра символов
# и только по целым словам. Сценарий зависит от "locate"
# и предполагает, что база данных locate содержит актуальную информацию.
#
# Copyright 2003 by Akkana Peck.
# Допускается использование, распространение или модификация программы
# на условиях GPL.
import sys. os, string, re
# Имена файлов, которые мы будем считать относящимися к документации.
# Редактируйте по своему усмотрению. Следите за тем. чтобы
# новые имена добавлялись только в нижнем регистре,
docfilenames - [ \
"changelog". \
"readme", \
"install". \
howto . \
"authors", \
"news", \
"todo". \
"config", \
"sample" \
samples \
example . \
"examples", \
"ref", \
"guide", \
"manual", \
"quickstart", \ ., л
продолжение

•&>
thanks . \
"notes". \
"features", \
"faq". \
"acknowledgement". \
"bugs", \
"problems" \
def system out (cmdstr) :
retlist = []
fp = os.popen(cmdstr)
while 1:
s - fp.readlineO
if not s : break
retlist.append(s)
fp.closeO
return retlist
# mainO
for arg in sys.argv :
#print string.split(arg. " \t./")
files = system_out("locate " + arg + " | grep -w " + arg):
for path in files :
#print path
# Особый случай для файлов, в пути которых присутствуют слова
# "man", "doc" или "info":
i f (string.findtpath, "/man") >= 0) \
or (string.find(path. "/doc") >=* 0) \
or (string.find(path. "/info") >- 0) :
print path.
continue
# Проверить, совпадает ли с каким-либо именем в файле:
base = os.path.basename(path)
for nam in docfilenames :
if base ~ "" : continue
# Для поиска по части слова
# Поиск только по всему слову:
# Make a regexp to search for nam as full-word only
pat - "A" + nam + "$"
if (re.compile(nam).search(base, 1)) :
print path,
base = ""
continue
См. также
locate(l), grep(l).