2010-11-29 112 views
7

我們在Linux服務器上運行顛覆。當我們組織中的某個人需要全部小寫時,他們將大約3k個文件以混合大小寫覆蓋。如何在Subversion中將文件批量重命名爲小寫?

這工作在CLI

rename 'y/A-Z/a-z/' * 

但顯然會搞砸了顛覆。

svn rename 'y/A-Z/a-z/' * 

不工作,因爲顛覆處理不同的重命名我猜。那麼我怎樣才能做到批量工作呢?我吮吸CLI,所以請解釋它,就像我是你的父母。重命名所有3k文件不是我想要承擔的任務。

感謝

+0

我希望歷史不是問題。你已經失去了一切,重新命名後將再次失去它。 – jgifford25 2010-11-29 19:57:33

+0

感謝您的關注,但歷史不是問題,它是外部供應商提供的html文件的轉儲,無論如何我們只是按季度更換一次。 – invertedSpear 2010-11-29 19:59:32

回答

7
for src in *; do 
    dst=$(echo "$src" | tr '[A-Z]' '[a-z]') 
    [ "$src" = "$dst ] || svn rename "$src" "$dst" 
done 

工作原理:

  1. 遍歷源文件名。
  2. 目標文件名是小寫的源文件名。 tr按字符翻譯進行字符翻譯。
  3. 如果源文件名和目標文件名相同,我們可以,否則,svn重命名。您可以使用if語句,但對於使用||的單線條件很常見。

如果需要遞歸,你可以創建一個小腳本svn-lowername.sh(上述的輕微變體):

#!/bin/bash 
for src; do 
    dst=$(echo "$src" | tr '[A-Z]' '[a-z]') 
    [ "$src" = "$dst" ] || svn rename "$src" "$dst" 
done 

確保chmod +x svn-lowername.sh。然後執行:

find -name .svn -prune -o -type f -print0 | xargs -0 ./svn-lowername.sh 

如果你覺得這個問題可能會再次發生,在你的路徑的某處藏匿svn-lowername.sh(​​可能是一個好點),然後您可以在運行時,它失去了./前綴。

您也可以只是一個單一的目錄像這樣使用svn-lowername.sh

./svn-lowername.sh * 
+0

`*`不會遞歸通過子目錄,但會執行@ invertedSpear的第一個示例。他可能想要找到。或類似的。 – nmichaels 2010-11-29 19:47:51

1

這是一個有點哈克,但應在任意數量的嵌套目錄的工作:

find -mindepth 1 -name .svn -prune -o -print | (
    while read file; do 
     svn mv "$file" "`perl -e 'print lc(shift)' "$file"`" 
    done 
) 

而且,你可以恢復他們的承諾。管理線索可能是謹慎的。

1

在Subversion中重命名需要兩個步驟,一個svn copy後跟一個svn delete如果您想保留歷史記錄。如果您使用svn move,則會丟失文件的歷史記錄。

雖然此答案對您的問題沒有幫助,但它有助於防止這種情況再次發生。在您的Subversion存儲庫的預提交鉤子中實現case-insenstive.py腳本。下次有人試圖添加一個不同大小寫的文件時,pre-commit鉤子不會讓它們。