2

我有以下命令检查是否添加了任何新文件并自动调用svn add所有这些文件

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

但是当没有文件时,svn add会导致警告。

如何停止xargs调用上一个命令不会产生任何值?该解决方案需要与 GNU 和 BSD (Mac OS X) 版本的xargs.

4

4 回答 4

13

如果您运行的是 GNU 版本,请使用xargs -r

--no-run-if-empty  
-r
   如果标准输入不包含任何非空格,请不要运行该命令。
   通常,即使没有输入,该命令也会运行一次。这个选项
   是一个 GNU 扩展。

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

于 2013-09-15T13:35:12.783 回答
1

如果您使用 bash,另一种方法是将输出存储在数组中。并且只有在有输出时才运行 svn。

readarray -t OUTPUT < <(exec svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{print $2}')
[[ ${#OUTPUT[@]} -gt 0 ]] && svn add "${OUTPUT[@]}"
于 2013-09-15T14:50:11.583 回答
0

我最终使用了这个。不是很优雅,但很有效。

svn status | grep -v "^.[ \t]*\..*" | grep "^?" && svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{print $2}' | xargs svn add
于 2013-09-15T15:24:04.487 回答
0
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

于 2016-01-27T17:10:11.377 回答