SVN使用正则表达式重命名目录中的所有文件

时间:2012-04-02 16:28:01

标签: svn tortoisesvn

我可以使用正则表达式重命名TortoiseSVN目录中的所有文件吗?

基本上我想在.extension之前删除文件名的最后两个字符。

例如,

MyFileXY.c 
MyOtherFile12.c

更改为:

MyFile.c
MyOtherFile.c

3 个答案:

答案 0 :(得分:1)

不是在Tortoise本身,但你可以在各种shell脚本中使用Subversion客户端的命令行版本。在Shell中,它是 ,就像这个 1

$ find . \( -name ".svn" -prune -false \) -o -type f | while read file
  do
      newFile=${file%??}
      svn mv $file $newFile
  done

您可以使用现在包含在大多数Windows平台上的PowerShell执行类似操作(尽管您可能必须先安装.NET)。我给你的语法除了我真的不知道Powershell。

这是我告诉人们学习Subversion命令行的原因之一。它可以极大地扩展Subversion的功能来完成这样的任务。


1 语法以原样为基础,并且没有隐含的保证它是正确的。用户承担运行所述语法的所有责任。法官的所有决定都是最终决定。在法律禁止的地方提供无效。

答案 1 :(得分:1)

跟进@ DavidW的回答,这是执行此操作的基本PowerShell序列:

Get-ChildItem . | % { svn mv $_.name ( $_.name -replace '..\.','.' ) }

这适用于问题中的特定样本,但在文件名包含多个点的角落情况下会失败,例如像“ProjectX.MyFileXY.c”之类的东西。下面两个正则表达式中的任何一个都更健壮并且将处理多个点(这也显示了如何快速测试正则表达式/替换操作):

"ProjectX.MyFileXY.c" -replace '..\.(?=[^.]*$)','.'
"ProjectX.MyFileXY.c" -replace '..(\.[^.]*?)$','$1'

虽然问题只是要求处理当前目录中的文件,但David包含了处理后代的内容,所以我认为我应该将我的解决方案概括为并行性。 一般的解决方案 - 检查以当前目录为根的子树 - 只需要为Get-ChildItem添加几个参数(我还在这里交换了一个更强大的正则表达式):

Get-ChildItem . -Recurse -NoContainer |
    % { svn mv $_.name ( $_.name -replace '..\.(?=[^.]*$)','.' ) }

但是这样做修剪私有.svn目录,就像David使用Linux find命令一样。由于Get-ChildItem没有这样的选项,我在我的开源库(下载Get-EnhancedChildItem)中添加了一个增强版本(here),其中包含一些其他参数; -ExcludeTree相当于-prune

Get-EnhancedChildItem . -ExcludeTree .svn -Recurse -NoContainer |
    % { svn mv $_.name ( $_.name -replace '..\.(?=[^.]*$)','.' ) }

最后,我的增强cmdlet提供了另一个选项(-Svn),可用于不仅忽略Subversion的私有目录,而是忽略不在Subversion源下的任何文件控制:

Get-EnhancedChildItem . -Svn -Recurse -NoContainer |
    % { svn mv $_.name ( $_.name -replace '..\.(?=[^.]*$)','.' ) }

答案 2 :(得分:0)

  

我可以使用常规方法重命名TortoiseSVN目录中的所有文件   表达

没有。 svn move中的SRC和DST是字符串常量

如果你的shell 可以执行这样的修剪,你可以尝试在svn命令中使用结果,但无论如何 - 它不是游戏的SVN部分