在 bashrc 函数的输出上使用 -exec

Using -exec on output from bashrc function

在 Cygwin 中,我写了一个 bashrc 函数 rg,它基本上是一个递归的 grep 语句:

rg () {
    find . -type f -exec grep -il  {} \;
}

这很好用,但现在我需要 运行 在每个输出行上进行额外的 grep 以检查另一个词。我基本上希望它列出包含这两个词的每个文件(不一定在同一行)。我试过这个命令:

rg Word1 -exec grep -il Word2 {} \;

这似乎只是输出包含 "Word1".

的相同文件

我尝试了下一个命令,我认为它只会在每一行输出 "Ha",但它仍然会列出 "rg Word1" 语句中的文件。

rg Word1 -exec echo "Ha" \;

所以我显然在这里做错了什么。谁能消除我的困惑?我知道在 grep 本身有一种方法可以做到这一点,但这似乎是在每行的基础上工作的。我猜我想做的事情很常见。同样,一旦我开始工作,为了方便起见,我想将它放在另一个 bashrc 函数中。不确定这是否会使它变得更复杂。

如果您拥有或可以获得它,xargs 命令会从其标准输入中收集命令的参数,然后 运行 指定命令。您可以将其与 rg 函数结合使用以过滤函数的输出。例如,

rg Word1 | xargs grep -il Word2

参数 xargs 从其标准输入中读取——函数 rg 发出的文件名——将附加到给定的命令 (grep -il Word2) 中,结果命令 运行。如果 xargs 的输入足够长,参数将被拆分到 grep 命令的多次调用中,这对输出没有影响(在这种情况下),但可以避免由于参数过多而导致命令执行失败.


还考虑以相同的方式构造函数 rg(即使用 xargs),以尽量减少执行的单独 grep 进程的数量。开始一个新流程是您可以做的比较昂贵的事情之一。