‘find’ is essentially a recursively visiting-evaluation loop. It is supposed to 
print every result matches the expression immediately (or alternatingly to 
those sub-expressions, you may say), therefore it has the best performance.

Am I correct in saying that what you want to do is deferring ‘results’, actions 
or side-effects to the end of searching?

This is not what ‘find’ good at, and it implies a buffer to keep the 
intermediate results.
In case you’re avoiding to simply do the ‘find’ twice, from a performance point 
of view, I’d like to suggest tagging those results, sorting them later (ie. 
piping to ‘sort’, which does has a buffer internally) and finally cutting out 
tags:

find /usr -name sh -printf 'a:%p\n' -o -name gcc -printf 'b:%p\n'

b:/usr/bin/gcc
a:/usr/bin/sh
b:/usr/lib/gcc
a:/usr/lib/klibc/bin/sh
b:/usr/share/bash-completion/completions/gcc
a:/usr/share/bash-completion/completions/sh
b:/usr/share/doc/gcc
b:/usr/share/doc/gcc-9-base/gcc

find /usr -name sh -printf 'a:%p\n' -o -name gcc -printf 'b:%p\n' | sort -s 
-t':' -k1,1 | cut -d':' -f2-

/usr/bin/sh
/usr/lib/klibc/bin/sh
/usr/share/bash-completion/completions/sh
/usr/bin/gcc
/usr/lib/gcc
/usr/share/bash-completion/completions/gcc
/usr/share/doc/gcc
/usr/share/doc/gcc-9-base/gcc

Reply via email to