Don't call xargs if the previous command doesn

2019-07-22 04:16发布

问题:

This question already has an answer here:

  • How to ignore xargs commands if stdin input is empty? 6 answers

I have the following command that checks if any new files are added and automatically calls svn add on all these files

svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{print $2}' | xargs svn add

But when there are no files, svn add results in a warning.

How to stop from xargs from getting called the previous command doesn't result in any values? The solution needs to work with both GNU and BSD (Mac OS X) versions of xargs.

回答1:

If you're running the GNU version, use xargs -r:

--no-run-if-empty  
-r
   If the standard input does not contain any nonblanks, do not run the command.
   Normally, the command is run once even if there is no input. This option
   is a GNU extension.

http://linux.die.net/man/1/xargs



回答2:

If you're using bash, another way is to just store outputs in arrays. And run svn only if the there is an output.

readarray -t OUTPUT < <(exec svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{print $2}')
[[ ${#OUTPUT[@]} -gt 0 ]] && svn add "${OUTPUT[@]}"


回答3:

I ended up using this. Not very elegant but works.

svn status | grep -v "^.[ \t]*\..*" | grep "^?" && svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{print $2}' | xargs svn add


回答4:

ls /empty_dir/ | xargs -n10 chown root   # chown executed every 10 args
ls /empty_dir/ | xargs -L10 chown root   # chown executed every 10 lines
ls /empty_dir/ | xargs -i cp {} {}.bak   # every {} is replaced with the args from one input line
ls /empty_dir/ | xargs -I ARG cp ARG ARG.bak # like -i, with a user-specified placeholder

https://stackoverflow.com/a/19038748/1655942



标签: shell xargs