使用空格自动添加SVN命令行

时间:2011-10-24 07:59:34

标签: linux svn shell command-line

我有一个SVN存储库。我有一个shell / bash脚本,旨在自动将所有未版本控制的文件添加到存储库。它看起来像这样:

 svn status | grep '^?' | sed 's/^.* /svn add /' | bash;

除非我的一个新文件在文件名中有空格,否则它的效果很好。如何修改此命令来处理它?<​​/ p>

4 个答案:

答案 0 :(得分:4)

为了避免在这里引用问题,你应该完全避免shell调用并改为使用xargs,这也会加快这个过程:

svn status | grep '^?' | sed -e 's/^? *//' | xargs --no-run-if-empty -d '\n' svn add

这将处理大多数特殊字符,但可以逃脱换行,但由于这些是svn status和grep的记录分隔符,所以无论如何你都不会好得多。

答案 1 :(得分:3)

您使用脚本很奇怪,因为svn add --force .可以单独执行此操作:

> svn status
?       INSTALL
?       trunk/INSTALL
?         trunk/INSTALL WITH SPACE
> svn add --force .
A         trunk/INSTALL
A         INSTALL
A         trunk/INSTALL WITH SPACE

不再对空白大惊小怪: - )

答案 2 :(得分:1)

基本上,

echo -e "? a b c'd'\n? b a" | sed -e "s/'/'\\\\''/g" -e "s/^. /svn add '/" -e 's/$/'\''/'

应该有用。

echo命令用于模拟svn status的“最坏情况输出”。因此,您必须使用echo替换完整的svn status | grep '^?'命令。我,你得到了

svn status | grep '^?' | sed -e "s/'/'\\\\''/g" -e "s/^. /svn add '/" -e 's/$/'\''/' | bash

说明:如果您将所有文件名放在' ... '中,则只需在文件名中查看'。您可以用'\''替换它们,终止字符串,插入原始'并重新启动新字符串。

为了做到这一点,你用'替换每个'\'',然后将文件名放在'...'

因此文件名a b c'd'会转到组件'a b c'\''d'\',因此它是'a b c'\''d'\'。上面的代码添加了一个空'',但这并没有伤害。

答案 3 :(得分:0)

这适用于空格:

svn status | grep '^?' | sed 's/^.* \(.*\)$/svn add "\1"/' | bash;

但是你仍然会遇到引号和其他字符的问题。