Subject: New xargs, was Re: upgrade to mv
To: der Mouse <mouse@Rodents.Montreal.QC.CA>
From: Frederick Bruckman <fredb@immanent.net>
List: tech-userlevel
Date: 08/16/2001 10:14:51
On Wed, 15 Aug 2001, der Mouse wrote:
> > it would mean i could do things like:
> > find . -name \*.html -print0 | xargs -0 mv -d otherplace
>
> The right place to fix this is xargs, not every program you find
> yourself wanting to use with xargs. I long ago wrote my own xargs
> (largely to get rid of the quoting misfeatures in the stock one) and
> gave it a way to do such things:
>
> * -k<str> indicates that instead of taking the given command and
> * arguments and appending the arguments derived from
> * the input, xargs should modify and replicate certain
> * arguments. Any argument containing <str> will be
> * replicated, once per string,
[snip]
That looks really useful! I've done
commands | xargs -n1 sh -c 'command $2 arg arg'
to achieve a similar effect, but it's awkward, and to build it up, you
have to watch the quoting carefully.
> * -r<c><s1><c><s2>
This looks like it could be useful, too, but your explanation is
giving me a headache. :-)
1) I think it would be clearer if it were more like the "sed" manpage,
with plain text for BNF, like
-r/string1/string2
plus a remark that any character can be used for '/', and if
2) the examples would give the exact input, as "echo foo bar baz |
xargs ..."
> * indicates that certain argument(s) (or portions
> * thereof) to the command are to be replicated. If
> * <s1> appears as an argument to the command, all
> * arguments between that and the next argument equal to
> * <s2> (or the last argument, if no argument equals
> * <s2>) are replicated, appearing once per string.
> * (Normally, -k will be used as well, and at least one
> * of the replicated arguments will include the -k
> * string, but this does not have to be so.) If an
> * argument to the command contains but is not equal to
> * <s1>, then part of that argument is replicated.
> * Specifically, everything from immediately after the
> * <s1>, up to but not including the next <s2> (or the
> * end of the argument if there is no following <s2>),
> * is replicated. If -k is used and the replicated
> * portion contains the -k string, each copy will have
> * the -k string replaced as appropriate. For example,
> *
> * xargs -kXX -r/A/B cmd mAjB blivet A -q XX -f mXX B -t
> *
> * will run commands like
> *
> * cmd mjjj blivet -q foo -f mfoo -q bar -f mbar -q blee -f mblee -t
> *
> * while
> *
> * xargs -kXX -r/A/B cmd -t mAjXXkB
> *
> * will run commands like
> *
> * cmd -t mjfookjbarkjbleek
> *
> * Neither <s1> nor <s2> may be zero-length; it is also
> * an error for the second <c> to be missing.
Frederick