4 comments

[ 3.2 ms ] story [ 19.8 ms ] thread
The examples are somewhat forced:

    find ~/Desktop -name "*.jpg" -o -name "*.gif" -o -name "*.png" \
    -print0 | xargs -0 mv --target-directory ~/Pictures
What's wrong with this?...

    mv ~/Desktop/**/*.{jpg,gif,png} ~/Pictures
Indeed. With zsh (and I guess more recent bash's), a lot of find is no longer necessary.

The real nugget in there is using xargs AT ALL. A lot of people don't know about it and continue with the -exec option of find. Which works fine still, but is horribly inefficient. Although to be fair, I haven't found this inefficiency to be even measurable (in real time-wasted units) unless the process being exec'd is slow to start.

Depends on how many files you have. In my line of work (web archiving) I frequently have more files than '*' can cope with - so need to use find even for mundane tasks
xargs cannot replace {} with a lot of arguments, so if mv did not have --target-directory, then xargs would have to do:

   find ... | xargs -0 -i {} mv {} ~/Pictures
which would run one mv per file.

GNU Parallel http://www.gnu.org/software/parallel/ allows for replacing {} with multiple arguments. So this would do the right thing:

   find ... | parallel -X -0 mv {} ~/Pictures
GNU Parallel is useful for many other applications. Watch the intro video to learn more: http://www.youtube.com/watch?v=OpaiGYxkSuQ