我們在Linux服務器上運行顛覆。當我們組織中的某個人需要全部小寫時,他們將大約3k個文件以混合大小寫覆蓋。如何在Subversion中將文件批量重命名爲小寫?
這工作在CLI
rename 'y/A-Z/a-z/' *
但顯然會搞砸了顛覆。
svn rename 'y/A-Z/a-z/' *
不工作,因爲顛覆處理不同的重命名我猜。那麼我怎樣才能做到批量工作呢?我吮吸CLI,所以請解釋它,就像我是你的父母。重命名所有3k文件不是我想要承擔的任務。
感謝
我們在Linux服務器上運行顛覆。當我們組織中的某個人需要全部小寫時,他們將大約3k個文件以混合大小寫覆蓋。如何在Subversion中將文件批量重命名爲小寫?
這工作在CLI
rename 'y/A-Z/a-z/' *
但顯然會搞砸了顛覆。
svn rename 'y/A-Z/a-z/' *
不工作,因爲顛覆處理不同的重命名我猜。那麼我怎樣才能做到批量工作呢?我吮吸CLI,所以請解釋它,就像我是你的父母。重命名所有3k文件不是我想要承擔的任務。
感謝
for src in *; do
dst=$(echo "$src" | tr '[A-Z]' '[a-z]')
[ "$src" = "$dst ] || svn rename "$src" "$dst"
done
工作原理:
||
的單線條件很常見。如果需要遞歸,你可以創建一個小腳本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 *
`*`不會遞歸通過子目錄,但會執行@ invertedSpear的第一個示例。他可能想要找到。或類似的。 – nmichaels 2010-11-29 19:47:51
這是一個有點哈克,但應在任意數量的嵌套目錄的工作:
find -mindepth 1 -name .svn -prune -o -print | (
while read file; do
svn mv "$file" "`perl -e 'print lc(shift)' "$file"`"
done
)
而且,你可以恢復他們的承諾。管理線索可能是謹慎的。
在Subversion中重命名需要兩個步驟,一個svn copy
後跟一個svn delete
如果您想保留歷史記錄。如果您使用svn move
,則會丟失文件的歷史記錄。
雖然此答案對您的問題沒有幫助,但它有助於防止這種情況再次發生。在您的Subversion存儲庫的預提交鉤子中實現case-insenstive.py腳本。下次有人試圖添加一個不同大小寫的文件時,pre-commit鉤子不會讓它們。
我希望歷史不是問題。你已經失去了一切,重新命名後將再次失去它。 – jgifford25 2010-11-29 19:57:33
感謝您的關注,但歷史不是問題,它是外部供應商提供的html文件的轉儲,無論如何我們只是按季度更換一次。 – invertedSpear 2010-11-29 19:59:32