Live data from Hacker News

The power of find and xargs

danielmiessler.com

1–5 of 5 posts

Re: The power of find and xargs

#2
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

Re: The power of find and xargs

#3

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.

Re: The power of find and xargs

#4
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

Re: The power of find and xargs

#5

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

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