script recursivo não funciona

script recursivo não funciona

Estou tentando adicionar suporte recursivo ao meuscript filegrep.

Por algum motivo, isso não funciona conforme o esperado:

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

Gostaria de evitar o uso de funções neste caso para melhor legibilidade.

EDIT: o script deve funcionar assim:

para cada argumento passado:

  • se o argumento atual for um diretório, verifique se o modo recursivo está habilitado e se sim faça a chamada recursiva;
  • caso contrário, se o argumento atual for um arquivo, chame grepcom o padrão atual;
  • caso contrário, assuma que o argumento atual é um padrão grep ou uma opção grep e anexe-o à $GREP_ARGSlista atual.

Talvez isso não seja totalmente confiável, mas funciona bem para mim como um substituto para zgrep, pdfgrep, etc.

Responder1

Tente usar a -Hopção para grep:

   -H, --with-filename
          Print the filename for each match.

Então, em vez de chamar seu script, basta fazer:

grep -H PATTERN [FILE...]

Além disso, é uma boa ideia verificar a página de manual da ferramenta que você está usando antes de tentar escrever um script wrapper. Para ferramentas Unix comuns, as opções simples que você deseja quase sempre já estão incorporadas à ferramenta.

Responder2

Finalmente descobri que o problema era grepo -rswitchignora stdin e pesquisa no diretório de trabalho atual. Para forçar a leitura do stdin, acabei de adicionar -:

filecat "$ARG" | grep $GREP_ARGS - | sed "s#^#$ARG: #"

informação relacionada