1.11. Поиск всей документации к программе
Проблема
Требуется найти все файлы README и HOWTO, все журналы изменений, руководства, примеры и прочую документацию, прилагаемую к установленной программе.
Решение
Воспользуйтесь finddoc — замечательным сценарием Python, любезно предоставленным Акканой Пек.
Имя сценария может быть произвольным. Не забудьте разрешить его исполнение:
$ 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 -i 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 True:
s = fp.readline()
if not s:
break
retlist.append(s)
fp.close()
return retlist
# main
for arg in sys.argv:
# Поиск файлов
files = system_out("locate " + arg + " | grep -w " + arg)
for path in files:
# Особый случай для файлов, в пути которых присутствуют слова
# "man", "doc" или "info":
if (string.find(path, "/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
# Поиск только по всему слову:
pat = "^" + nam + "$"
if re.compile(nam).search(base):
print(path)
base = ""
continue
См. также
locate(1), grep(1).