<div dir="auto">That is excellent, thank you for that!</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Jan 12, 2022, 9:22 PM Bob Proulx <<a href="mailto:bob@proulx.com">bob@proulx.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">alan schmitz wrote:<br>
> That is great info, thank you!  One test I ran a long time ago wrt find is<br>
> the difference between:<br>
> find . -type f -exec grep notLklyToBeFnd {} \;<br>
> vs.<br>
> find . -type f | xargs grep notLklyToBeFnd<br>
> <br>
> I'm not sure if it holds today, but when I ran it back then the xargs<br>
> version was much faster than the -exec.  Of course that was a very long<br>
> time ago.<br>
<br>
In the above find since \; is used it means that it will repeatedly<br>
execute grep once per file.  Conceptually it is similar to this with<br>
lots of grep invocations.<br>
<br>
    for file in $(find . -type f -print); do<br>
        grep $file<br>
    done<br>
<br>
But the xargs will spool up as many files as possible for one grep.<br>
The file I/O is the same but the process fork() & exec() is reduced to<br>
the minimum for the xargs case.  But there is that pipe where file<br>
names are passed as character I/O from process to process.<br>
Conceptually somewhat similar to this.<br>
<br>
    grep PATTERN $(find . -type f -print | while IFS= read -r file; do echo $file; done)<br>
<br>
That's why it is better to use + instead of \; as + invokes grep just<br>
once with as many args as possible.  It's doing exactly what xargs did<br>
but doing it completely internal to find.  Which saves not only the<br>
process creation time but also the pipe I/O writing from find into the<br>
pipe and reading from the pipe by xargs.  Since it is all in find now<br>
that character I/O between processes is no longer needed.<br>
<br>
    find . -type f -exec grep PATTERN {} +<br>
<br>
Conceptually it is similar to this following, but avoiding all<br>
problems of file whitespace and special characters.<br>
<br>
    grep PATTERN $(find . -type f -print)<br>
<br>
Why isn't + as well known as \; is?  Because + is *new* in the grand<br>
scheme of things.  It was introduced in 2005.  Or as I say, just the<br>
other day!  So if you learned how to use find before 2005 you learned<br>
the \; syntax.  But it's been 17 years now and -exec ... {} + is a<br>
POSIX standard that all finds must implement.  Most people entering<br>
the work force today never learned the old syntax.<br>
<br>
I will end with repeating the current best practice.<br>
<br>
    find . -type f -exec grep PATTERN {} +<br>
<br>
Bob<br>
</blockquote></div>