我如何批量重命名文件在Subversion中小写?

我们在Linux服务器上运行颠覆。 当我们组织中的某人需要全部使用小写字母时,他们将大约3k个文件混合使用。

这在CLI中起作用

rename 'y/AZ/az/' * 

但显然会搞砸颠覆。

 svn rename 'y/AZ/az/' * 

不行,因为颠覆处理重命名不同,我猜。 那么我怎样才能做到批量工作? 我吮吸CLI,所以请解释它,就像我是你的父母。 重新命名所有3k文件不是我想要承担的任务。

谢谢

 for src in *; do dst=$(echo "$src" | tr '[AZ]' '[az]') [ "$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 '[AZ]' '[az]') [ "$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在您的路径中( ~/bin/可能是个好地方),然后在运行时会丢失./前缀。

你也可以像这样使用svn-lowername.sh

 ./svn-lowername.sh * 

这有点不好意思,但应该处理任何数量的嵌套目录:

 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版本库的pre-commit钩子中实现case-insenstive.py脚本。 下次有人试图添加一个不同大小写的文件时,pre-commit钩子不会让他们。