Estoy intentando agregar soporte recursivo a misecuencia de comandos de archivo.
Por alguna razón esto no funciona como se esperaba:
RECURSIVE_MODE=off
# iterate over args
for ARG in "$@"
do
if [ -d "$ARG" ] && [ $RECURSIVE_MODE = on ] ; then
# recursive call
$0 $GREP_ARGS $ARG/*
elif [ -f "$ARG" ]; then
filecat "$ARG" | grep $GREP_ARGS | sed "s#^#$ARG: #"
else
[ "$ARG" = "-r" ] && RECURSIVE_MODE=on
# append to the current grep args
GREP_ARGS="$GREP_ARGS $ARG"
fi
done
Me gustaría evitar el uso de funciones en este caso para una mejor legibilidad.
EDITAR: el script debería funcionar así:
para cada argumento pasado:
- si el argumento actual es un directorio, verifique si el modo recursivo está habilitado y, en caso afirmativo, realice la llamada recursiva;
- de lo contrario, si el argumento actual es un archivo, llame
grep
con el patrón actual; - de lo contrario, asuma que el argumento actual es un patrón grep o un modificador grep y agréguelo a la
$GREP_ARGS
lista actual.
Quizás esto no sea completamente confiable, pero me funciona bien como reemplazo de zgrep
, pdfgrep
, etc.
Respuesta1
Intente usar la -H
opción para grep
:
-H, --with-filename Print the filename for each match.
Entonces, en lugar de llamar a tu script, simplemente haz:
grep -H PATTERN [FILE...]
Además, es una buena idea consultar la página de manual de la herramienta que está utilizando antes de intentar escribir un script contenedor. Para las herramientas comunes de Unix, las opciones simples que desea casi siempre ya están integradas en la herramienta.
Respuesta2
Finalmente descubrí que el problema era que grep
con el -r
interruptorignora la entrada estándar y busca en el directorio de trabajo actual. Para forzar la lectura estándar, acabo de agregar -
:
filecat "$ARG" | grep $GREP_ARGS - | sed "s#^#$ARG: #"