Я пытаюсь добавить рекурсивную поддержку в свойскрипт filegrep.
По какой-то причине это не работает так, как ожидалось:
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
В данном случае я бы хотел избежать использования функций для лучшей читабельности.
EDIT: скрипт должен работать так:
для каждого переданного аргумента:
- если текущий аргумент является каталогом, проверьте, включен ли рекурсивный режим, и если да, выполните рекурсивный вызов;
- в противном случае, если текущий аргумент является файлом, вызвать
grep
с текущим шаблоном; - в противном случае предположим, что текущий аргумент является шаблоном grep или переключателем grep, и добавим его в текущий
$GREP_ARGS
список.
Возможно, это не совсем надежно, но для меня это отлично работает как замена zgrep
, pdfgrep
, и т. д.
решение1
Попробуйте использовать -H
опцию grep
:
-H, --with-filename Print the filename for each match.
Поэтому вместо вызова вашего скрипта просто сделайте:
grep -H PATTERN [FILE...]
Также, хорошей идеей будет проверить страницу руководства для используемого вами инструмента, прежде чем пытаться написать скрипт-обертку. Для обычного инструмента Unix простые опции, которые вам нужны, почти всегда уже встроены в инструмент.
решение2
Я наконец-то понял, что проблема была grep
в -r
переключателеигнорирует stdin и вместо этого ищет в текущем рабочем каталоге. Чтобы принудительно запустить чтение stdin, я просто добавил -
:
filecat "$ARG" | grep $GREP_ARGS - | sed "s#^#$ARG: #"