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" {} +
)
( -I
y -H
siendo extensiones de GNU).
Usar como:
mygrep pattern dir1 dir2
(asegurándose dir1
de que dir2
no parezcan find
predicados).
Elimine el -exec sh...+
si no le interesan esos mensajes de advertencia.
Es una mala idea usarlo grep
como nombre de alias cuando cambia su comportamiento de manera tan dramática.
Si necesita pasar opciones grep
, puede usar la GREP_OPTIONS
variable 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 mygrep
pasar opciones grep
con 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 mygrep
dó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 -- dir
o mygrep -f patternfile -- dir
).