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

SVN使用正则表达式重命名目录中的所有文件,svn,tortoisesvn,Svn,Tortoisesvn,我可以使用正则表达式重命名OrtoiseSVN目录中的所有文件吗 基本上,我想去掉文件扩展名前的最后两个字符 比如说, MyFileXY.c MyOtherFile12.c 改为: MyFile.c MyOtherFile.c 我是否可以使用常规名称重命名OrtoiseSVN目录中的所有文件 表情 否。svn move中的SRC和DST是字符串常量 如果您的shell可以执行这样的修剪,您可以尝试在svn命令中使用结果,但无论如何-它不是游戏的svn部分不是在Tortoise中,但您可以使

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

基本上,我想去掉文件扩展名前的最后两个字符

比如说,

MyFileXY.c 
MyOtherFile12.c
改为:

MyFile.c
MyOtherFile.c
我是否可以使用常规名称重命名OrtoiseSVN目录中的所有文件 表情

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


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

不是在Tortoise中,但您可以使用Subversion客户端的命令行版本在各种shell脚本中使用。在Shell中,它应该是这样的东西1:

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

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



1语法是按原样给出的,不能保证它是正确的。用户承担运行上述语法的所有责任。法官的所有决定都是最终决定。在法律禁止的情况下,要约无效

继@DavidW的回答之后,下面是执行此操作的基本PowerShell序列:

Get-ChildItem . | % { svn mv $_.name ( $_.name -replace '..\.','.' ) }
这将适用于问题中的特定示例,但在文件名包含多个点(例如“ProjectX.MyFileXY.c”)的情况下,它将失败。下面两个正则表达式中的任何一个都更健壮,并且将处理多个点(这也说明了如何快速测试正则表达式/替换操作):

虽然这个问题只要求处理当前目录中的文件,但David还包括处理子体,因此我认为我应该推广我的解决方案,以实现并行性。 一般的解决方案——检查根在当前目录中的子树——只需要添加几个参数就可以得到ChildItem(我在这里还交换了一个更健壮的正则表达式):

但这并不像David使用Linux
find
命令那样修剪私有
.svn
目录。因为
getchilditem
没有这样的选项,所以我在我的开源库(下载)中添加了一个增强版(),其中包括一些额外的参数
-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 '..\.(?=[^.]*$)','.' ) }

如果我没有Subversion,我可以用我安装的当前现有的TortoiseSVN客户端安装它吗?如果你有TortoiseSVN 1.7,你已经有了Subversion命令行实用程序,所以你不需要安装任何东西。只需检查Ortoisesvn下的bin目录。还要注意,David的脚本(即
find
命令)是针对Linux/Unix的,而不是针对Windows的。谢谢。我本来会做一个PowerShell答案,但我上周四才开始学习,可能会在这项工作中使用它,以后再也不会使用它了。它肯定比cmdshell的语法好,但我更喜欢使用Python或Perl。
Get-ChildItem . -Recurse -NoContainer |
    % { svn mv $_.name ( $_.name -replace '..\.(?=[^.]*$)','.' ) }
Get-EnhancedChildItem . -ExcludeTree .svn -Recurse -NoContainer |
    % { svn mv $_.name ( $_.name -replace '..\.(?=[^.]*$)','.' ) }
Get-EnhancedChildItem . -Svn -Recurse -NoContainer |
    % { svn mv $_.name ( $_.name -replace '..\.(?=[^.]*$)','.' ) }