我可以使用正则表达式重命名TortoiseSVN目录中的所有文件吗?
基本上我想在.extension之前删除文件名的最后两个字符。
例如,
MyFileXY.c
MyOtherFile12.c
更改为:
MyFile.c
MyOtherFile.c
答案 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部分