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

时间:2010-11-29 19:40:17

标签: linux svn

我们正在Linux服务器上运行subversion。当他们需要全部小写时,我们组织中的某人用大小写混合了约3k文件。

这适用于CLI

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

但显然会破坏颠覆。

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

不起作用,因为subversion处理重命名的方式不同我想。那么我怎么能做这个批处理工作呢?我很熟悉CLI,所以请解释一下我就像你的父母一样。手动重命名所有3k文件不是我想要承担的任务。

由于

3 个答案:

答案 0 :(得分: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语句,但对于使用||的单行条件非常常见。
  4. 如果您需要递归,可以创建一个小脚本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~/bin/可能是一个好地方),然后您可以在运行时丢失./前缀。

    您也可以在一个目录上使用svn-lowername.sh,如下所示:

    ./svn-lowername.sh *
    

答案 1 :(得分:1)

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

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

此外,您可以恢复他们的提交。管理线索可能是谨慎的。

答案 2 :(得分:1)

Subversion中的重命名需要两个步骤,如果您想保留历史记录,则需要svn copy后跟svn delete。如果您使用svn move,则会丢失文件的历史记录。

虽然这个答案对你的问题没有帮助,但它有助于防止这种情况再次发生。在Subversion存储库的预提交钩子中实现case-insenstive.py脚本。下次有人尝试添加具有不同案例的文件时,预提交挂钩将不允许它们。