Я бы использовал find
:
mygrep() (
pattern=$1; shift
find "$@" -type d -path '*/app/lib/bower' -exec sh -c '
printf >&2 "Warning: ignoring \"%s\" directory\n" "$@"
' sh {} + -prune -o -type f -exec grep -IHne "$pattern" {} +
)
( -I
и -H
являются расширениями GNU).
Используйте как:
mygrep pattern dir1 dir2
(убедитесь, что dir1
и dir2
не похожи на предикаты find
).
Удалите -exec sh ... +
, если вас не интересуют эти предупреждающие сообщения.
Плохая идея использовать grep
в качестве псевдонима, когда вы так резко меняете его поведение.
Если вам нужно передать параметры в grep
, вы можете использовать переменную GREP_OPTIONS
, например:
GREP_OPTIONS=-i mygrep foo dir
Но обратите внимание, что поддержка этой опции будет удалена в будущих версиях grep
, поэтому лучшим вариантом может быть предоставление возможности в mygrep
передавать параметры в grep
, как с выделенным массивом, если ваша оболочка их поддерживает:
mygrep() (
pattern=$1; shift
find "$@" -type d -path '*/app/lib/bower' -exec sh -c '
printf >&2 "Warning: ignoring \"%s\" directory\n" "$@"
' sh {} + -prune -o -type f -exec \
grep -IHne "${g[@]}" "$pattern" {} +
)
g=(-i --exclude-dir=.git); mygrep foo dir1 dir2
Или используйте -
, чтобы указать mygrep
, где останавливаются параметры:
mygrep() (
grep_options=()
for i do
grep_options+=("$i")
shift
[ "$i" != "--" ] || break
done
pattern=${1?need a pattern}; shift
find "$@" -type d -path '*/app/lib/bower' -exec sh -c '
printf >&2 "Warning: ignoring \"%s\" directory\n" "$@"
' sh {} + -prune -o -type f -exec \
grep -H "${grep_options[@]}" "$pattern" {} +
)
mygrep -nI --exclude-dir=.git -- pattern dir1 dir2
(и убедитесь, что вы не передаете -
в качестве аргументов параметров, поскольку in, если вы хотите исключить файлы -
, используйте - exclude = -
, а не - exclude -
, например. Это также исключает использование например mygrep -e pattern1 -e pattern2 - dir
или mygrep -f patternfile - dir
).