Как узнать, исправила ли эта операция fsck какие-либо ошибки файловой системы?

Если вы хотите избежать повторной распаковки файла для каждого шаблона, вы можете:

PATTERNS='foo
bar
baz' find. -mtime -"$a" -type f ! -name "*.bak*" -exec awk -v q=\' '
  function shquote(s) {
    gsub(q, q "\\" q q, s)
    return q s q
  }
  BEGIN {
    n = split(ENVIRON["PATTERNS"], pats, "\n")
    for (arg = 1; arg < ARGC; arg++) {
      file = ARGV[arg]
      cmd = "gzip -dcf < " shquote(file)
      for (i = 1; i <= n; i++) notfound[pats[i]]
      left = n
      while (left && (cmd | getline line) > 0) {
        for (pat in notfound) {
          if (line ~ pat) {
            if (!--left) {
              print file
              break
            }
            delete notfound[pat]
          }
        }
      }
      close(cmd)
    }
    exit
  }' {} +

Обратите внимание, что шаблоны принимаются как шаблоны awk, что похоже на расширенные регулярные выражения, поддерживаемые grep -E/ egrep. Для сопоставления без учета регистра вы можете добавить -v IGNORECASE=1при использовании GNU awkили перенести на:

PATTERNS='foo
bar
baz' find. -mtime -"$a" -type f ! -name "*.bak*" -exec awk -v q=\' '
  function shquote(s) {
    gsub(q, q "\\" q q, s)
    return q s q
  }
  BEGIN {
    n = split(tolower(ENVIRON["PATTERNS"]), pats, "\n")
    for (arg = 1; arg < ARGC; arg++) {
      file = ARGV[arg]
      cmd = "gzip -dcf < " shquote(file)
      for (i = 1; i <= n; i++) notfound[pats[i]]
      left = n
      while (left && (cmd | getline line) > 0) {
        line = tolower(line)
        for (pat in notfound) {
          if (line ~ pat) {
            if (!--left) {
              print file
              break
            }
            delete notfound[pat]
          }
        }
      }
      close(cmd)
    }
    exit
  }' {} +

(при условии, что шаблоны не имеют нестандартных -расширений ERE, таких как \S, которые будут преобразованы в\s).

Вы можете поместить эту команду awkв сценарий zgrep-many, чтобы упростить ее использование. Что-то вроде:

#! /bin/sh -

usage() {
  cat >&2 << EOF
Usage: $0 [-e <pattern>] [-f <file] [-i] [pattern] files

List the files for which all the given patterns are matched.
EOF
  exit 1
}

ignorecase= 
PATTERNS=
export PATTERNS
NL='
'
sep=

while getopts e:f:i opt; do
  case $opt in
    (e) PATTERNS=$PATTERNS$sep$OPTARG; sep=$NL;;
    (f) PATTERNS=$PATTERNS$sep$(cat < "$OPTARG") || exit; sep=$NL;;
    (i) ignorecase='tolower(';;
    (*) usage;;
  esac
done
shift "$((OPTIND - 1))"
if [ -z "$PATTERNS" ]; then
  [ "$#" -gt 0 ] || usage
  PATTERN=$1; shift
fi

[ "$#" -eq 0 ] && exit

exec awk -v q=\' '
  function shquote(s) {
    gsub(q, q "\\" q q, s)
    return q s q
  }
  BEGIN {
    n = split('"$ignorecase"'ENVIRON["PATTERNS"]'"${ignorecase:+)}"', pats, "\n")
    for (arg = 1; arg < ARGC; arg++) {
      file = ARGV[arg]
      cmd = "gzip -dcf < " shquote(file)
      for (i = 1; i <= n; i++) notfound[pats[i]]
      left = n
      while (left && (cmd | getline line) > 0) {
        '"${ignorecase:+line = tolower(line)}"'
        for (pat in notfound) {
          if (line ~ pat) {
            if (!--left) {
              print file
              break
            }
            delete notfound[pat]
          }
        }
      }
      close(cmd)
    }
    exit
  }' "$@"

Использовать как:

find... -exec zgrep-many -ie foo -e bar -e baz {} +

например.

2
05.11.2019, 18:26
1 ответ

Лучшим способом определить, исправила ли эта конкретная fsckоперация какие-либо ошибки, было бы проверить ее код выхода.:e2fsckустанавливает бит 1 своего кода выхода, если она исправила ошибки, и бит 2, если она исправила ошибки, требующие перезагрузки(т.е. в смонтированной файловой системе ).

Вы также можете определить, что e2fsckне вносил здесь никаких изменений, потому что в выводе не упоминается

***** FILE SYSTEM WAS MODIFIED *****

который e2fsckвыводит, если были внесены какие-либо изменения (, если не была указана опция -p).

4
27.01.2020, 21:58

Теги

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