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).