我正在尝试查找特定类型且不包含特定字符串的所有文件。我试图通过管道 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
。您还需要使用grep
with-L
选项(没有匹配的文件),否则它将输出文件内容而不是其名称,就像在您的示例中一样。
find . -type f -iname "*.java" -exec grep -L "something somethin" {} \+
Run Code Online (Sandbox Code Playgroud)
你几乎真的得到了它......
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)
将做更多的工作来搜索所有内容,但应该会给你一些输出。