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
).