Is it possible to pipe the results of FIND to a COPY command CP?

There's a little-used option for cp: -t destination -- see the man page:

find . -iname "*.SomeExt" | xargs cp -t Directory

You can use | like below:

find . -iname "*.SomeExt" | while read line
do
  cp $line DestDir/
done

Answering your questions:

  • | can be used to solve this issue. But as seen above, it involves a lot of code. Moreover, | will create two process - one for find and another for cp.

  • Instead using exec() inside find will solve the problem in a single process.


Good question!

  1. why cant you just use | pipe? isn't that what its for?

You can pipe, of course, xargs is done for these cases:

find . -iname "*.SomeExt" | xargs cp Destination_Directory/
  1. Why does everyone recommend the -exec

The -exec is good because it provides more control of exactly what you are executing. Whenever you pipe there may be problems with corner cases: file names containing spaces or new lines, etc.

  1. how do I know when to use that (exec) over pipe | ?

It is really up to you and there can be many cases. I would use -exec whenever the action to perform is simple. I am not a very good friend of xargs, I tend to prefer an approach in which the find output is provided to a while loop, such as:

while IFS= read -r result
do
    # do things with "$result"
done < <(find ...)