grep alias para ignorar de forma segura varios directorios

grep alias para ignorar de forma segura varios directorios

El uso diario es:

grep -rIn pattern directory

Hay algunos archivos que quiero evitar, están en directorios que tienen este tipo de ruta en algún momento: app/lib/bower/lodash, app/lib/bower/paho-mqtt-js, app/lib/bower/socket-io-client.

La solución ideal es detectar app/lib/bower/en el camino, pero es difícil. ¿Es posible?

Se me ocurrió:

alias grep='grep --exclude-dir={lodash,paho-mqtt-js,socket-io-client}'

Suficientemente bueno (aunque necesita mantenimiento cuando se agregan cosas nuevas). ¿Cómo agregar al menos una breve advertencia a stderr si grep excluye el directorio?

Respuesta1

Yo usaría 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" {} +
)

( -Iy -Hsiendo extensiones de GNU).

Usar como:

mygrep pattern dir1 dir2

(asegurándose dir1de que dir2no parezcan findpredicados).

Elimine el -exec sh...+si no le interesan esos mensajes de advertencia.

Es una mala idea usarlo grepcomo nombre de alias cuando cambia su comportamiento de manera tan dramática.

Si necesita pasar opciones grep, puede usar la GREP_OPTIONSvariable como:

GREP_OPTIONS=-i mygrep foo dir

Pero tenga en cuenta que la compatibilidad con esa opción se eliminará en versiones futuras de grep, por lo que una mejor opción podría ser permitir mygreppasar opciones grepcon una matriz dedicada si su shell las admite:

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

O utilice --para indicar mygrepdónde terminan las opciones:

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

(y asegúrese de no pasar --argumentos como opción, como si desea excluir los --archivos, use --exclude=--, no --exclude --por ejemplo. Eso también excluye usos como mygrep -e pattern1 -e pattern2 -- diro mygrep -f patternfile -- dir).

información relacionada