Note on rgrep/powershell/find topic from last night's meeting.
alan schmitz
alan.schmitz88 at gmail.com
Wed Jan 12 21:34:23 MST 2022
That is excellent, thank you for that!
On Wed, Jan 12, 2022, 9:22 PM Bob Proulx <bob at proulx.com> wrote:
> alan schmitz wrote:
> > That is great info, thank you! One test I ran a long time ago wrt find
> is
> > the difference between:
> > find . -type f -exec grep notLklyToBeFnd {} \;
> > vs.
> > find . -type f | xargs grep notLklyToBeFnd
> >
> > I'm not sure if it holds today, but when I ran it back then the xargs
> > version was much faster than the -exec. Of course that was a very long
> > time ago.
>
> In the above find since \; is used it means that it will repeatedly
> execute grep once per file. Conceptually it is similar to this with
> lots of grep invocations.
>
> for file in $(find . -type f -print); do
> grep $file
> done
>
> But the xargs will spool up as many files as possible for one grep.
> The file I/O is the same but the process fork() & exec() is reduced to
> the minimum for the xargs case. But there is that pipe where file
> names are passed as character I/O from process to process.
> Conceptually somewhat similar to this.
>
> grep PATTERN $(find . -type f -print | while IFS= read -r file; do
> echo $file; done)
>
> That's why it is better to use + instead of \; as + invokes grep just
> once with as many args as possible. It's doing exactly what xargs did
> but doing it completely internal to find. Which saves not only the
> process creation time but also the pipe I/O writing from find into the
> pipe and reading from the pipe by xargs. Since it is all in find now
> that character I/O between processes is no longer needed.
>
> find . -type f -exec grep PATTERN {} +
>
> Conceptually it is similar to this following, but avoiding all
> problems of file whitespace and special characters.
>
> grep PATTERN $(find . -type f -print)
>
> Why isn't + as well known as \; is? Because + is *new* in the grand
> scheme of things. It was introduced in 2005. Or as I say, just the
> other day! So if you learned how to use find before 2005 you learned
> the \; syntax. But it's been 17 years now and -exec ... {} + is a
> POSIX standard that all finds must implement. Most people entering
> the work force today never learned the old syntax.
>
> I will end with repeating the current best practice.
>
> find . -type f -exec grep PATTERN {} +
>
> Bob
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.nclug.org/pipermail/nclug/attachments/20220112/bf341892/attachment.htm>
More information about the NCLUG
mailing list