Поиск страниц справочника, которые содержат ВСЕ 'нечто' слов 'панель' и 'baz'

Обычно как root:

mkdir /etc/bind
chown bind:bind /etc/bind
12
16.06.2014, 02:19
4 ответа

Я реализовал скрипт, который делает именно это.

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

Думаю, это была пустая трата времени :(

Edit: Похоже, что

man -K expr1 expr2 expr3

не сработало?

Edit: Теперь вы можете передать скрипты для поиска через . /script foo bar

5
27.01.2020, 19:56

Не так полно, как ответ @polym, но я собирался предложить что-то вроде

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 - который может быть не тем, что вы хотите (хотите ли вы включить соответствия типа foolish и nutbar?)

.
2
27.01.2020, 19:56

Размещение другое решение, поскольку файл записывается случайным образом, нарушает мой хвост . Мышление RSYNC здесь может быть многообещающим, поскольку rsync может работать с использованием алгоритма передачи Delta, сохраняя время передачи, только отправляя измененные части файла. Если вы запустите rsync на двух локальных файлах, он будет по умолчанию - весь файл режим, который не то, что вы хотите.

Предлагаемое

rsync -av --inplace --no-whole-file /your/local/file.dat /your/remote/file.dat

... или, может быть, (если крепление CIFS не согласуется с Delta Transfer), используйте Pure rsync :

rsync -av --inplace --no-whole-file /your/local/file.dat remoteserver:/your/directory/file.dat

, поэтому вы запускаете это несколько раз, когда ваш файл 200 ГБ заполняется. Каждый раз, когда вы запускаете его, он обновляет удаленный файл постепенно. Это даже должно работать, когда исходный файл обновляется случайным образом. Может быть, вы могли бы запустить это каждые 15 минут. Затем, когда ваша PID заканчивается, вы бы запустили его еще раз, и это просто будет быстрой инкрементной дельтой.

-121--83288-

Несколько мыслей о сценарии этого:

  • с использованием Manpath , чтобы получить местоположение (ы) страниц человека. Если я добавлю /home/graeme/.cabal/bin к моему путь , Manpath Man ) найдет страницы человека в /home/graeme/.cabal/share/man .

  • Используйте себе человека, чтобы распаковать и форматировать страницы перед поиском, таким образом, вы просто ищете сам текст человека, а не комментарию и т. Д. В файл RAW. Использование Man потенциально будет иметь дело с несколькими форматами.

  • Сохранение отформатированных страниц в TEMPFILE позволит избежать нескольких распаковцев и должна значительно ускорить вещи.

Вот идет (с 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)
3
27.01.2020, 19:56

Этот подход не проверен, но довольно прост (глупо прост )и я ожидаю, что он должен работать, даже если он неэффективен:

#!/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[@]}"
0
27.01.2020, 19:56

Теги

Похожие вопросы