2010-11-29 116 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钩子不会让它们。