2012-04-02 60 views

回答

0

我可以重命名使用正則表達式 在TortoiseSVN的一個目錄中的所有文件?

號SRC和DST在svn move字符串常量

如果您外殼可以進行這樣的微調,可以嘗試使用結果SVN命令裏面,但無論如何 - 它不是遊戲的SVN部分

1

不在Tortoise本身,但你可以在各種shell腳本中使用命令行版本的Subversion客戶端。在殼牌,它會是東西這樣:

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

您可以使用它現在包含在大多數Windows平臺(雖然你可能必須先安裝.NET PowerShell中做同樣的事情)。除非我真的不知道Powershell,否則我會給你這種語法。

這是我告訴人們學習Subversion命令行的原因之一。它可以極大地擴展Subversion執行這樣的任務的能力。


語法上給出的是基礎,沒有隱性擔保,這是正確的。用戶承擔運行所述語法的所有責任。法官的所有決定都是最終的。在法律禁止的情況下提供無效。

+0

如果我沒有Subversion,我可以使用當前已安裝的TortoiseSVN客戶端來安裝它嗎? – SSS 2012-04-02 23:11:49

+0

如果你有TortoiseSVN 1.7,你已經有了Subversion命令行工具 - 所以你不需要安裝任何東西。只需檢查TortoiseSVN下的bin目錄即可。另請注意,David的腳本(即'find'命令)適用於Linux/Unix,不適用於Windows。 – 2012-04-03 00:23:59

1

上@ DavidW的回答跟進,這裏是基本的PowerShell序列做到這一點:

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

這將在討論的特定樣本的工作,但其中一個文件名就會在角落的情況下失敗包含多個點,例如像「ProjectX.MyFileXY.c」。無論是以下兩個正則表達式都比較健全,可以處理多個點(這也說明了如何快速測試正則表達式/隔離替換操作):

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

儘管這個問題只要求在處理文件目前目錄,大衛包括處理後裔,所以我想我應該概括我的解決方案以及並行性。 一般的解決方法 - 檢查紮根在當前目錄下的子樹 - 需要增加只是一對夫婦的參數傳遞給Get-ChildItem(我也換在這裏更強大的regexs之一):

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

但這不是修剪私人.svn目錄,因爲大衛已完成Linux find命令。由於Get-ChildItem沒有這種選項,我在我的開源庫中添加了一個增強版本(Get-EnhancedChildItem)(下載here),其中包含一些附加參數; -ExcludeTree相當於-prune

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

最後,我增強了小命令提供了可用於不只是忽略Subversion的私有目錄而是忽略不是在顛覆任何文件,即使一個進一步的選項(-Svn)源代碼控制:

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

謝謝。我會做一個PowerShell的答案,但我剛剛在上週四開始學習它,並可能將其用於這個單一的工作,而不再使用它。它肯定比CMD shell的語法更好,但我寧願使用Python或Perl。 – 2012-04-04 15:19:39

相關問題