grep alias para ignorar com segurança vários diretórios

grep alias para ignorar com segurança vários diretórios

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" {} +
)

( -Ie -Hsendo extensões GNU).

Use como:

mygrep pattern dir1 dir2

(certificando-se dir1de dir2que não se parecem com findpredicados).

Remova o -exec sh...+se você não se importa com essas mensagens de aviso.

É uma má ideia usar grepseu 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_OPTIONSvariá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 mygreppassar opções para grepgostar 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 mygreponde 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 -- dirou mygrep -f patternfile -- dir).

informação relacionada