Don't call xargs if the previous command doesn

2019-07-22 04:32发布

This question already has an answer here:

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.

标签: shell xargs
4条回答
smile是对你的礼貌
2楼-- · 2019-07-22 04:41

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

查看更多
一夜七次
3楼-- · 2019-07-22 04:45
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

查看更多
Emotional °昔
4楼-- · 2019-07-22 04:47

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
查看更多
地球回转人心会变
5楼-- · 2019-07-22 04:58

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[@]}"
查看更多
登录 后发表回答