我有一个SVN存储库。我有一个shell / bash脚本,旨在自动将所有未版本控制的文件添加到存储库。它看起来像这样:
svn status | grep '^?' | sed 's/^.* /svn add /' | bash;
除非我的一个新文件在文件名中有空格,否则它的效果很好。如何修改此命令来处理它?</ p>
答案 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;
但是你仍然会遇到引号和其他字符的问题。