<div dir="ltr"><div>I ran the "find +" version on the same tree and results are almost exactly that of the xargs version (but easier to type):<br><br></div>Here's a summary of what's gone on so far:<br>I ran these commands on the same set of 6+GB of ebooks.<br><br>Commands benchmarked:<br>"rgrep": grep -r notLklyToBeFnd .<br>"find" find . -type f -exec grep notLklyToBeFnd {} \;<br>"pwsh": Get-ChildItem -Path "." -Recurse | Select-String -Pattern "notLklyToBeFnd" -CaseSensitive<br>"findxargs": find . -type f | xargs -d \\n grep notLklyToBeFnd^C<br>"findplus": find . -type f -exec grep notLklyToBeFnd {} +<br><br>All times are in seconds.<br><br>Linux machine, using bash and pwsh (cross-platform version of Microsoft PowerShell)<br>"rgrep"       3.1<br>"find"        5.5<br>"pwsh"       90<br>"findxargs"   3.2<br>"findplus"    3.2<br><br>Windows machine using cross-platform PowerShell and bash in WSL 2.0):<br>"rgrep"       4.6<br>"find"       50<br>"pwsh"       84<br>"findxargs"   4.8<br>"findplus"    4.7<br><br>I also tried "pwsh" in the older Windows/only variant of Powershell where "pwsh" took about 120 seconds.<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Jan 12, 2022 at 9:34 PM alan schmitz <<a href="mailto:alan.schmitz88@gmail.com">alan.schmitz88@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><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" target="_blank">bob@proulx.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);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>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature"><div>Brian Sturgill</div><div>President and CTO</div><div>Ataman Software, Inc.</div><div><br></div></div>