bash find xargs grep only single occurence

5,936

Solution 1

Simply keep it within the realm of find:

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

This is how it works:

The -exec will work when the -type f will be true. And because grep returns 0 (success/true) when the -exec grep "something" has a match, the -quit will be triggered.

Solution 2

To do this without changing tools: (I love 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

Solution 3

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

does exactly that: when the head terminates, the middle element of the pipe is notified with a 'broken pipe' signal, terminates in turn, and notifies the find. You should see a notice such as

xargs: grep: terminated by signal 13

which confirms this.

Share:
5,936
user2342506
Author by

user2342506

Updated on September 17, 2022

Comments

  • user2342506
    user2342506 over 1 year

    Maybe it's a bit strange - and maybe there are other tools to do this but, well..

    I am using the following classic bash command to find all files which contain some string:

    find . -type f | xargs grep "something"
    

    I have a great number of files, on multiple depths. first occurrence of "something" is enough for me, but find continues searching, and takes a long time to complete the rest of the files. What I would like to do is something like a "feedback" from grep back to find so that find could stop searching for more files. Is such a thing possible?

  • user2342506
    user2342506 over 11 years
    +1 for explanation and the alternative, though the other answer seems more elegant to me, since it is more self-sufficient
  • user2342506
    user2342506 over 10 years
    +1 never knew xargs would have such multitasking capabilities - thanks for other comments as well! :)