3 ms·
The power of find and xargs
- alextingle 16y agoThe 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
- michaelcampbell 16y agoIndeed. 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.
- junklight 16y agoDepends 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
- tange 16y agoxargs 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/ 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 http://www.youtube.com/watch?v=OpaiGYxkSuQ