Eu usaria 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 e -H são extensões do GNU).
Use como:
mygrep pattern dir1 dir2
(certificando-se de que dir1 e dir2 não se pareçam com find predicados).
Remova o -exec sh...+ se você não se importar com essas mensagens de aviso.
É uma má ideia usar grep como seu nome de alias quando você altera seu comportamento de forma tão radical.
Se você precisar passar opções para grep , poderá usar a variável GREP_OPTIONS como:
GREP_OPTIONS=-i mygrep foo dir
Mas observe que o suporte para essa opção será removido em versões futuras de grep , portanto, uma opção melhor pode ser dar uma maneira em mygrep de passar opções para grep como com um array dedicado se seu shell suporta-os:
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
Ou use -- para informar mygrep onde as opções param:
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
(e certifique-se de não passar -- como argumentos de opção, como se você quiser excluir os arquivos -- , use --exclude=-- , não --exclude -- , por exemplo. Isso também impede usos como mygrep -e pattern1 -e pattern2 -- dir ou mygrep -f patternfile -- dir ).