script recursivo no funciona

script recursivo no funciona

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 grepcon 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_ARGSlista actual.

Quizás esto no sea completamente confiable, pero me funciona bien como reemplazo de zgrep, pdfgrep, etc.

Respuesta1

Intente usar la -Hopció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 grepcon el -rinterruptorignora 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: #"

información relacionada