我的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
答案 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的模式匹配语言非常适合这样的任务。