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

0

O uso diário é:

grep -rIn pattern directory

Existem alguns arquivos que eu quero evitar, eles estão em diretórios que têm esse tipo de caminho neles 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 novas coisas forem adicionadas). Como, pelo menos, adicionar um pequeno aviso no stderr se o diretório for excluído pelo grep?

    
por Velkan 29.09.2016 / 10:03

1 resposta

0

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

    
por 29.09.2016 / 10:36

Tags