将shell输出管道传递到svn del命令?

7

我们的Drupal网站部署设置相当复杂,结合了CVS和SVN。我们使用CVS获取最新版本的模块,并使用SVN进行部署。不幸的是,当CVS更新删除文件时,Subversion会抱怨,因为它们在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个回答

10

可以尝试使用xargs,像这样:

svn st | grep ^! | cut -f2 | xargs svn rm
xargs 命令从标准输入中获取每一行,并将这些行作为参数传递给 svn rm 命令。默认情况下,xargs 在每次调用其命令时使用多个行,而对于 svn rm 命令来说,这是可以的。
您可能还需要尝试使用 cut 命令来得到正确的结果。默认情况下,cut 使用制表符作为分隔符,而 Subversion 可能会在其中输出空格。在这种情况下,您可能需要使用 cut -d' ' -f6 或其他类似命令。
像构建这样的命令管道时,按部就班地运行各个部分以确保看起来正确。因此,在将端口连接到结尾的"| xargs svn rm" 运行之前,请先运行到 cut 命令,以确保获得所需的文件名列表。

2
我会将 grep ! 更改为 grep ^!,以确保我们不会意外删除路径中带有感叹号的文件。 - Adam Bellaire
太棒了,我之前不知道cut或xargs。我知道Perl并不是最简单的方法,但我对它有一些熟悉度。 - Jamison Dance

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

0

作为上述选项的替代方案,我会使用类似以下的内容:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接