管道查找到 grep -v

Hya*_*elo 26 grep pipe find

我正在尝试查找特定类型且不包含特定字符串的所有文件。我试图通过管道 find 来解决它 grep -v

例子:

find -type f -name '*.java' | xargs grep -v "something something"
Run Code Online (Sandbox Code Playgroud)

这似乎不起作用。它似乎只是返回 find 命令找到的所有文件。我想要做的基本上是找到与某个文件名匹配的所有 .java 文件(例如,以 SessionPb.java 中的“Pb”结尾)并且其中没有“extends SomethingSomething”。

我怀疑是我做错了。那么命令应该是什么样子呢?

rus*_*ush 26

这里不需要xargs。您还需要使用grepwith-L选项(没有匹配的文件),否则它将输出文件内容而不是其名称,就像在您的示例中一样。

find . -type f -iname "*.java" -exec grep -L "something somethin" {} \+
Run Code Online (Sandbox Code Playgroud)

  • @user946850 `-exec ... {} \+` 不等同于 `xargs`。请阅读 findutils 文档!(我已经很努力了!) (6认同)
  • 不是在最后加上额外的 +。 (3认同)
  • @user946850 每次我写 `find -exec \+` 时,都会有人写信告诉我使用 xargs 更好。为什么在写评论之前没有人看起来像男人?(: (2认同)
  • @ user946850 是的。区别之一是(默认情况下)`xargs` 处理其输入并在空格上分隔参数。引号对于 `xargs` 也是特殊的(默认情况下)。对于`-exec ... {} +`,这些都不是真的。`xargs` 的旧版本曾经将下划线视为 EOF 指示符,但现在不再如此。 (2认同)

lor*_*nix 7

你几乎真的得到了它......

find . -type f -iname "*.java" -print0 | xargs -0 grep -v "something something"
Run Code Online (Sandbox Code Playgroud)

点“.” 说从这里开始。(你的暗示......但永远不要假设)。

-iname使用不区分大小写的搜索,以防万一(或不区分大小写)。
-print0将文件名发送到带有尾随 \x00 字符的 xargs,这可以防止文件名中包含空格的问题。

xargs 上的“-0”表示期望以 \x00 结尾的文件名而不是返回。

还有你的 grep 命令...

差不多明白了。


编辑::

从您的更新:

find . -type f -iname "*pb.java" -print0 | xargs -0 grep -iL "something"
Run Code Online (Sandbox Code Playgroud)

应该有帮助。(从@rush 的回答中添加了 -L,干得好)

我知道您的 grep 需要 '-i' 选项,或者不那么明确。

分部分尝试该命令...这个输出文件名是否正确?

find . -type f -iname "*pb.java"
Run Code Online (Sandbox Code Playgroud)

如果是这样,那么您的问题可能是您的 grep 搜索模式不匹配(拼写错误?它发生了!),或者只是没有任何匹配项。

绝对最坏情况:

grep -riL "something" *
Run Code Online (Sandbox Code Playgroud)

将做更多的工作来搜索所有内容,但应该会给你一些输出。