递归脚本不起作用

递归脚本不起作用

我正在尝试添加递归支持文件grep脚本

由于某种原因,这不能按预期工作:

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

我想避免在这种情况下使用函数以获得更好的可读性。

编辑:该脚本应该像这样工作:

对于每个传递的参数:

  • 如果当前arg是一个目录,检查是否启用了递归模式,如果是则进行递归调用;
  • 否则如果当前 arg 是一个文件,则使用grep当前模式调用;
  • 否则假设当前 arg 是 grep 模式或 grep 开关并将其附加到当前$GREP_ARGS列表。

也许这并不完全可靠,但它对我来说很好用,可以替代zgreppdfgrep等。

答案1

尝试使用-H以下选项grep

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

因此,不必调用脚本,只需执行以下操作:

grep -H PATTERN [FILE...]

另外,在尝试编写包装器脚本之前,最好先检查您正在使用的工具的手册页。对于常见的 Unix 工具,您想要的简单选项几乎总是已经内置在工具中。

答案2

我终于发现问题出grep-r开关上忽略 stdin 并在当前工作目录中搜索。为了强制读取标准输入,我刚刚添加了一个-

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

相关内容