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 forfind
and another forcp
.Instead using
exec()
insidefind
will solve the problem in a single process.
Good question!
- 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/
- 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.
- 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 ...)