O uso diário é:
grep -rIn pattern directory
Existem alguns arquivos que quero evitar, eles estão em diretórios que possuem esse tipo de caminho em algum momento: app/lib/bower/lodash
, app/lib/bower/paho-mqtt-js
, app/lib/bower/socket-io-client
.
A solução ideal é detectar app/lib/bower/
no caminho, mas é difícil. É possível?
Eu descobri:
alias grep='grep --exclude-dir={lodash,paho-mqtt-js,socket-io-client}'
Bom o suficiente (embora precise de manutenção quando novos itens são adicionados). Como adicionar pelo menos um breve aviso ao stderr se o diretório for excluído pelo grep?
Responder1
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
sendo extensões GNU).
Use como:
mygrep pattern dir1 dir2
(certificando-se dir1
de dir2
que não se parecem com find
predicados).
Remova o -exec sh...+
se você não se importa com essas mensagens de aviso.
É uma má ideia usar grep
seu nome alternativo quando você muda seu comportamento de forma tão dramática.
Se você precisar passar opções para grep
, você pode usar a GREP_OPTIONS
variável como:
GREP_OPTIONS=-i mygrep foo dir
Mas observe que o suporte para essa opção será removido em versões futuras do grep
, então uma opção melhor pode ser fornecer uma maneira de mygrep
passar opções para grep
gostar com um array dedicado se o seu shell as suportar:
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 dizer 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 --
argumentos de opção, como se 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
).