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

7
我们在Linux服务器上运行Subversion。我们机构中的某个人在需要将全部文件名小写的情况下,意外地覆盖了大约3k个混合大小写的文件。
这个命令可以在CLI中工作。
rename 'y/A-Z/a-z/' *

但显然会破坏Subversion。
svn rename 'y/A-Z/a-z/' * 

这个问题无法解决,我猜是因为subversion在处理重命名时有所不同。那么该如何批量处理呢?我不太会使用CLI,请用通俗易懂的语言解释给我听,就像你在给你的父母解释一样。手动重命名三千个文件很麻烦,我不想这么做。

谢谢。


我希望历史记录不是问题。你已经失去了所有的东西,在重命名后会再次失去它们。 - jgifford25
谢谢关心,但历史记录不是问题。这只是来自外部供应商的HTML文件转储,我们每季度都会进行替换。 - invertedSpear
3个回答

7
创建一个小脚本svn-lowername.sh:
#!/bin/bash
# svn rename each supplied file with its lowercase
for src; do
    dst="$(dirname "$src")/$(basename "$src" | tr '[A-Z]' '[a-z]')"
    [ "$src" = "$dst" ] || svn rename "$src" "$dst"
done

请确保执行chmod +x svn-lowername.sh。然后执行以下命令:
它的工作原理如下:
  1. 循环遍历每个提供的文件名。
  2. 将文件名的基本名称转换为小写,目录部分不变,使用tr逐个字符进行转换。(如果需要支持非ASCII字母,则需要制作更复杂的映射。)
  3. 如果源文件名和目标文件名相同,则没问题;否则,执行svn rename。(您可以使用if语句代替,但对于单行条件语句,使用||是相当惯用的。)
您可以将其用于目录中的所有文件:
./svn-lowername.sh *

如果你想要递归地执行这个操作:

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

如果你认为这个问题可能会再次发生,可以将svn-lowername.sh存放在某个路径中(例如~/bin/),这样在运行时就不需要添加./前缀了。

* 不会递归子目录,但会执行 @invertedSpear 的第一个示例所做的操作。他可能想要使用 find . . 或类似命令。 - nmichaels
@Nathon:是的,我没有添加递归,因为“这个有效”的示例不是递归的。 - Laurence Gonsalves
我正在尝试您的第一个选项,但似乎出了些问题,或者是我自己搞砸了。正如我所说,我不太擅长命令行操作,因此我没有正确的术语,但当我输入您的示例并按回车键时,它会跳转到新的一行,并显示“>”符号,所以我必须使用ctrl+c返回提示符。有什么想法吗? - invertedSpear
@invertedSpear: 天啊,你有3000个文件都在同一个目录下? - nmichaels
好的,我稍微修改了一下,变成了这样,然后它就可以工作了:[for src in *; do dst=$(echo "$src" | tr '[A-Z]' '[a-z]'); svn rename "$src" "$dst"; done] - invertedSpear
显示剩余8条评论

1

在Subversion中进行重命名需要两步操作,首先是一个svn copy,然后是一个svn delete,如果您想保留历史记录。如果使用svn move,则会丢失文件的历史记录。

虽然这个答案并不能帮助解决您的问题,但它可以避免同样的问题发生。在您的Subversion仓库中的pre-commit hook实现case-insenstive.py脚本。下次有人试图添加一个大小写不同的文件时,pre-commit hook将阻止他们。


1

这有点巧妙,但应该适用于任意数量的嵌套目录:

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

另外,你可以撤销他们的提交。使用 clue-by-four 进行管理可能是明智的。


无法撤销他们的提交,因为这是来自外部供应商的更新垃圾。因此,先前的文档已经过时。哦,还有那个家伙刚刚辞职了,所以现在我必须修复它。 - invertedSpear
1
这种方法更好,因为它不依赖于shell将*扩展为目录中的所有文件。这可能会在没有任何警告的情况下使命令行超载。是的,命令行可能非常长,但当发生这种情况时,你会发现只有一部分文件被重命名,而且没有任何警告表明命令没有完成所指定的任务。 - David W.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接