Если вы хотите избежать повторной распаковки файла для каждого шаблона, вы можете:
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 {} +
например.
Лучшим способом определить, исправила ли эта конкретная fsck
операция какие-либо ошибки, было бы проверить ее код выхода.:e2fsck
устанавливает бит 1 своего кода выхода, если она исправила ошибки, и бит 2, если она исправила ошибки, требующие перезагрузки(т.е. в смонтированной файловой системе ).
Вы также можете определить, что e2fsck
не вносил здесь никаких изменений, потому что в выводе не упоминается
***** FILE SYSTEM WAS MODIFIED *****
который e2fsck
выводит, если были внесены какие-либо изменения (, если не была указана опция -p
).