czy mój skrypt działał? nie wyraziłeś żadnej opinii :)
polym
Odpowiedzi:
5
Zaimplementowałem skrypt, który właśnie to robi.
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
Myślę, że to strata czasu :(
Edycja: Wygląda na to
man -K expr1 expr2 expr3
nie działało?
Edycja: możesz teraz przekazać skrypty wyszukiwanymi hasłami ./script foo bar
Dziwne, ale ^ prawdziwe ^ - ale fajnie było głosować za stratą czasu ...
mikeserv
Używając różnych argumentów or, pomyślałem tylko, że andnie przetestowałem tego poprawnie.
Graeme
3
Kilka uwag na temat pisania skryptów:
Używanie, manpathaby uzyskać lokalizację stron man. Jeśli dodam /home/graeme/.cabal/bindo moich PATH, manpath(i man) znajdzie strony podręcznika w /home/graeme/.cabal/share/man.
Skorzystaj z man, aby zdekompresować i sformatować strony przed rozpoczęciem wyszukiwania, w ten sposób przeszukujesz sam tekst man, a nie żadnych komentarzy itp. W surowym pliku. Korzystanie manpotencjalnie poradzi sobie z wieloma formatami.
Zapisanie sformatowanych stron w pliku tymczasowym pozwoli uniknąć wielu dekompresji i powinno znacznie przyspieszyć proces.
Oto (z bashi GNU find):
#!/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)
Zauważ, że dodałem -wprzełącznik (dopasowywanie słów) do greps- co może nie być tym, czego chcesz (czy chcesz uwzględnić dopasowania takie jak foo lish i nut bar ?)
To podejście jest niesprawdzone, ale dość proste (głupie proste) i spodziewam się, że powinno działać, nawet jeśli jest nieefektywne:
#!/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[@]}"
Odpowiedzi:
Zaimplementowałem skrypt, który właśnie to robi.
Myślę, że to strata czasu :(
Edycja: Wygląda na to
nie działało?
Edycja: możesz teraz przekazać skrypty wyszukiwanymi hasłami
./script foo bar
źródło
or
, pomyślałem tylko, żeand
nie przetestowałem tego poprawnie.Kilka uwag na temat pisania skryptów:
Używanie,
manpath
aby uzyskać lokalizację stron man. Jeśli dodam/home/graeme/.cabal/bin
do moichPATH
,manpath
(iman
) znajdzie strony podręcznika w/home/graeme/.cabal/share/man
.Skorzystaj z man, aby zdekompresować i sformatować strony przed rozpoczęciem wyszukiwania, w ten sposób przeszukujesz sam tekst man, a nie żadnych komentarzy itp. W surowym pliku. Korzystanie
man
potencjalnie poradzi sobie z wieloma formatami.Zapisanie sformatowanych stron w pliku tymczasowym pozwoli uniknąć wielu dekompresji i powinno znacznie przyspieszyć proces.
Oto (z
bash
i GNU find):źródło
Nie tak kompletna jak odpowiedź @ polym, ale zamierzałem coś zasugerować
Zauważ, że dodałem
-w
przełącznik (dopasowywanie słów) dogreps
- co może nie być tym, czego chcesz (czy chcesz uwzględnić dopasowania takie jak foo lish i nut bar ?)źródło
To podejście jest niesprawdzone, ale dość proste (głupie proste) i spodziewam się, że powinno działać, nawet jeśli jest nieefektywne:
źródło