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
grep
com 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_ARGS
lista 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 -H
opçã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 grep
o -r
switchignora 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: #"