मैं उन मैन पेजों की खोज करना चाहता हूँ, जिनमें 'फू', 'बार' और 'बाज' जैसे सभी शब्द हैं।
यदि संभव हो, तो मैं सभी मैन पेजों के सभी पाठ (केवल नाम और विवरण नहीं) के माध्यम से खोजना चाहूंगा।
मैं कुछ ऐसा अनुमान लगा रहा हूं
man -K foo AND bar AND baz
मैं उन मैन पेजों की खोज करना चाहता हूँ, जिनमें 'फू', 'बार' और 'बाज' जैसे सभी शब्द हैं।
यदि संभव हो, तो मैं सभी मैन पेजों के सभी पाठ (केवल नाम और विवरण नहीं) के माध्यम से खोजना चाहूंगा।
मैं कुछ ऐसा अनुमान लगा रहा हूं
man -K foo AND bar AND baz
जवाबों:
मैंने एक स्क्रिप्ट लागू की जो ठीक यही करती है।
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
or
, मैंने केवल यह सोचा था and
क्योंकि मैंने इसे ठीक से परीक्षण नहीं किया था।
इसे पटकथा पर कुछ विचार:
manpath
आदमी पृष्ठों के स्थान (ओं) को प्राप्त करने के लिए उपयोग करना । अगर मैं /home/graeme/.cabal/bin
अपने को जोड़ूं PATH
, manpath
(और man
) मैन पेजों को खोजेगा /home/graeme/.cabal/share/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)
@ पॉलिम के उत्तर के रूप में पूर्ण नहीं है, लेकिन मैं ऐसा कुछ सुझाव देने जा रहा था
while IFS= read -rd $'\0' f; do
zgrep -qwm1 'foo' "$f" && \
zgrep -qwm1 'bar' "$f" && \
zgrep -qwm1 'baz' "$f" && \
printf '%s\n' "$f"
done < <(find /usr/share/man -name '*.gz' -print0)
ध्यान दें कि मैंने एक -w
(वर्ड मैच) स्विच को इसमें जोड़ा है greps
- जो आप नहीं चाहते हैं (क्या आप फू लिश और नट बार जैसे मैचों को शामिल करना चाहते हैं ?)
यह दृष्टिकोण अप्रयुक्त है लेकिन काफी सरल (बेवकूफ सरल) है और मुझे उम्मीद है कि यह काम करना चाहिए, भले ही अक्षम हो:
#!/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[@]}"