管道输出到svn del命令?

时间:2009-09-10 20:33:57

标签: shell svn

我的Drupal站点有一个相当复杂的部署设置,它是CVS和SVN的组合。我们使用CVS来获取最新版本的模块,并使用SVN进行部署。不幸的是,当CVS更新删除文件时,Subversions会抱怨因为它们没有在SVN中删除。我正在尝试做一些shell脚本和Perl来对已经从文件系统中删除的所有这些文件运行svn rm命令,但我还没有完成。到目前为止我所拥有的是:

svn st | grep !

这将输出从文件系统中删除的所有文件的列表,如下所示:

!       panels_views/panels_views.info
!       panels_views/panels_views.admin.inc
!       contexts/term.inc
!       contexts/vocabulary.inc
!       contexts/terms.inc
!       contexts/node_edit_form.inc
!       contexts/user.inc
!       contexts/node_add_form.inc
!       contexts/node.inc
etc. . .

但是,我想以某种方式在每一行上运行svn del。如何将此输出添加到我的Perl脚本中,或者如何在这些行中运行svn del

编辑:我使用的确切命令,在所有人的帮助下,

svn st | grep ^! | cut -c 9- | xargs svn del

3 个答案:

答案 0 :(得分:10)

尝试使用xargs,如下所示:

svn st | grep ^! | cut -f2 | xargs svn rm

xargs命令在其标准输入上占用行,并将它们转过来并将这些行用作svn rm上的命令行参数。默认情况下,xargs在每次调用其命令时都会使用多行,在svm rm的情况下就可以了。

您可能还需要尝试使用cut命令才能使其正常运行。默认情况下,cut使用制表符作为分隔符,Subversion可以在那里输出空格。在这种情况下,您可能必须使用cut -d' ' -f6或其他内容。

与构建此类命令管道时一样,一次运行部分以确保事物看起来正确。因此,请运行cut命令以确保您拥有所需的文件名列表,之前再次使用"| xargs svn rm"再次运行它。

答案 1 :(得分:1)

svn st | egrep ^! | cut -b 9- | xargs svn del

答案 2 :(得分:0)

作为上述选择的替代方案,我会使用类似的东西:

svn st | awk '$1=="!"{print $2}' | xargs svn del

我发现awk的模式匹配语言非常适合这样的任务。