bash find xargs grep only single occurence
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.
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.
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