мой сценарий работал? Вы не дали никакой обратной связи :)
Polym
Ответы:
5
Я реализовал скрипт, который делает именно это.
if [ $# -eq 0 ]; then
PATTERNS=(NAME AUTHOR EXAMPLES FILES)
else
PATTERNS=( "$@" )
fi
[ ${#PATTERNS[@]} -lt 1 ] && echo "Needs at least 1 pattern to search for" && exit 1
for i in $(find /usr/share/man/ -type f); do
TMPOUT=$(zgrep -l "${PATTERNS[0]}" "$i")
[ -z "$TMPOUT" ] && continue
for c in `seq 1 $((${#PATTERNS[@]}-1))`; do
TMPOUT=$(echo "$TMPOUT" | xargs zgrep -l "${PATTERNS[$c]}")
[ -z "$TMPOUT" ] && break
done
if [ ! -z "$TMPOUT" ]; then
#echo "$TMPOUT" # Prints the whole path
MANNAME="$(basename "$TMPOUT")"
man "${MANNAME%%.*}"
fi
done
Думаю, это была пустая трата времени :(
Редактировать: похоже
man -K expr1 expr2 expr3
не работал?
Изменить: Вы можете передать сценарии теперь ваши условия поиска через ./script foo bar
Похоже, что сценарий - единственный путь в конце концов.
Грэм
2
Странно, но ^ правда ^ - но было весело голосовать за пустую трата времени ...
mikeserv
Используя разные аргументы or, я думал, что это только andпотому, что я не проверял это должным образом.
Грэм
3
Несколько мыслей по написанию скриптов это:
Использование manpathдля получения местоположения страниц руководства. Если я добавлю /home/graeme/.cabal/binк своему PATH, manpath(и man) найду страницы справочника /home/graeme/.cabal/share/man.
Используйте сам man для распаковки и форматирования страниц перед поиском, таким образом, вы просто ищете сам текст man, а не какие-либо комментарии и т. Д. В необработанном файле. Использование manпотенциально может иметь дело с несколькими форматами.
Сохранение отформатированных страниц в временном файле позволит избежать многократных распаковок и значительно ускорить процесс.
Здесь идет (с bashи GNU найти):
#!/bin/bash
set -f; IFS=:
trap 'rm -f "$temp"' EXIT
temp=$(mktemp --tmpdir search_man.XXXXXXXXXX)
while IFS= read -rd '' file; do
man "$file" >"$temp" 2>/dev/null
unset fail
for arg; do
if ! grep -Fq -- "$arg" "$temp"; then
fail=true
break
fi
done
if [ -z "$fail" ]; then
file=${file##*/}
printf '%s\n' "${file%.gz}"
fi
done < <(find $(manpath) -type d ! -name 'man*' -prune -o -type f -print0)
Обратите внимание, что я добавил -wпереключатель (совпадение слов) к greps- который может не соответствовать вашим ожиданиям (хотите ли вы включить совпадения, такие как foo lish и nut bar ?)
Этот подход не проверен, но довольно прост (глупо прост), и я ожидаю, что он должен работать, даже если он неэффективен:
#!/bin/bash
if [ "$#" -eq 0 ]; then
echo "Provide arguments to search all man pages for all arguments." >&2
echo "Putting rare search terms first will improve performance." >&2
exit
fi
if [ "$#" -eq 1 ]; then
exec man -K "$@"
fi
pages=( $(man -wK "$1") )
shift
while [ "$#" -gt 1 ]; do
pages=( $(zgrep -l "$1" "${pages[@]}") )
shift
done
exec man "${pages[@]}"
Ответы:
Я реализовал скрипт, который делает именно это.
Думаю, это была пустая трата времени :(
Редактировать: похоже
не работал?
Изменить: Вы можете передать сценарии теперь ваши условия поиска через
./script foo bar
источник
or
, я думал, что это толькоand
потому, что я не проверял это должным образом.Несколько мыслей по написанию скриптов это:
Использование
manpath
для получения местоположения страниц руководства. Если я добавлю/home/graeme/.cabal/bin
к своемуPATH
,manpath
(иman
) найду страницы справочника/home/graeme/.cabal/share/man
.Используйте сам man для распаковки и форматирования страниц перед поиском, таким образом, вы просто ищете сам текст man, а не какие-либо комментарии и т. Д. В необработанном файле. Использование
man
потенциально может иметь дело с несколькими форматами.Сохранение отформатированных страниц в временном файле позволит избежать многократных распаковок и значительно ускорить процесс.
Здесь идет (с
bash
и GNU найти):источник
Не так полно, как ответ @ polym, но я собирался предложить что-то вроде
Обратите внимание, что я добавил
-w
переключатель (совпадение слов) кgreps
- который может не соответствовать вашим ожиданиям (хотите ли вы включить совпадения, такие как foo lish и nut bar ?)источник
Этот подход не проверен, но довольно прост (глупо прост), и я ожидаю, что он должен работать, даже если он неэффективен:
источник