Remove a shell loop: xargs unusual usage
I would like to write down an unknown, yet very useful, usage of xargs(1).
In short, if I want to run a command on a list of files stored in a file, I could simply go for:
$ xargs -n1 ls -lh < files.lst
There is no magic here, after all this is the normal operation of xargs. But, we are mostly used in using xargs together with find(1), where again it applies a shell command on a file list, reading again from its standard input.
$ find -name '*.h' | xargs wc -l
What I have never realized is the fact that its standard input can come from a file. This is so commonly used pattern that I used to write it as:
$ for f in $(cat files.lst); do ls -lh $f; done
Although the loop construct looks clearer and the intention is reflected by shell’s syntax, it is though inefficient and needs far more keystrokes to be written.
I found this unusual usage of xargs at Design by Typing.