bash查找xargs grep仅一次出现


16

也许有点奇怪-也许还有其他工具可以做到这一点,但是。

我正在使用以下经典bash命令来查找包含某些字符串的所有文件:

find . -type f | xargs grep "something"

我有很多深度的文件。第一次出现“某物”对我来说已经足够了,但是find会继续搜索,并且需要很长时间才能完成其余文件。我想做的是从grep返回查找的“反馈”,以便查找可以停止搜索更多文件。这样的事情可能吗?

Answers:


20

只需将其保留在find范围内:

find . -type f -exec grep "something" {} \; -quit

它是这样工作的:

-exec会工作时,-type f会是真的。并且由于在匹配时grep返回0(成功/ true)-exec grep "something",因此-quit将触发。


8
find -type f | xargs grep e | head -1

确实可以做到这一点:当head终止时,管道的中间元素会收到“管道中断”信号通知,依次终止并通知find。您应该会看到诸如

xargs: grep: terminated by signal 13

这证实了这一点。


+1作为解释和替代方案,尽管其他答案对我来说似乎更优雅,因为它更自给自足
hello_earth 2013年

8

为此,无需更改工具:(我喜欢xargs)

#!/bin/bash
find . -type f |
    # xargs -n20 -P20: use 10 parallel processes to grep files in batches of 20
    # grep -m1: show just on match per file
    # grep --line-buffered: multiple matches from independent grep processes
    #      will not be interleaved
    xargs -P10 -n20 grep -m1 --line-buffered "$1" 2> >(
        # Error output (stderr) is redirected to this command.
        # We ignore this particular error, and send any others back to stderr.
        grep -v '^xargs: .*: terminated by signal 13$' >&2
    ) |
    # Little known fact: all `head` does is send signal 13 after n lines.
    head -n 1

1
+1从不知道xargs将具有这样的多任务处理功能-还要感谢其他评论!:)
hello_earth 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.