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

Linux 如何在Subversion中将文件批量重命名为小写?,linux,svn,Linux,Svn,我们正在Linux服务器上运行subversion。我们组织中的一些人在需要全部使用小写字母时,用混合大小写重写了大约3k个文件 这在CLI中起作用 rename 'y/A-Z/a-z/' * 但很明显,这将破坏颠覆 svn rename 'y/A-Z/a-z/' * 不起作用,因为我想subversion处理重命名的方式不同。那么,如何将其作为批处理作业来执行呢?我很讨厌CLI,所以请解释一下,就像我是你的父母一样。手动重命名所有3k文件不是我希望承担的任务 谢谢 工作原理: 循环源文件

我们正在Linux服务器上运行subversion。我们组织中的一些人在需要全部使用小写字母时,用混合大小写重写了大约3k个文件

这在CLI中起作用

rename 'y/A-Z/a-z/' *
但很明显,这将破坏颠覆

svn rename 'y/A-Z/a-z/' * 
不起作用,因为我想subversion处理重命名的方式不同。那么,如何将其作为批处理作业来执行呢?我很讨厌CLI,所以请解释一下,就像我是你的父母一样。手动重命名所有3k文件不是我希望承担的任务

谢谢

工作原理:

  • 循环源文件名
  • 目标文件名是小写的源文件名。tr进行逐字翻译
  • 如果源文件名和目标文件名相同,我们就可以了,否则,请svn重命名。您可以改用if语句,但对于单行程序条件,使用
    |
    是非常常见的
  • 如果需要递归,可以创建一个小脚本
    svn lowername.sh
    (上面的一个小变体):

    确保
    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副本
    ,然后一个
    svn删除
    ,如果您想保留历史记录。如果使用
    svn move
    将丢失文件的历史记录


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

    *
    不会在子目录中递归,但将执行@invertdspear的第一个示例所做的操作。他可能想找到或类似内容。@Nathon:是的,我没有添加递归,因为“this works”示例不是递归的。谢谢你说的对递归不是必需的,但谢谢你提供了它。不知道svn rename被添加到了Subversion的可用命令列表中:,这不是svn move吗?我正在尝试你的第一个选项,肯定是出了问题,否则我就搞砸了。正如我所说,我不喜欢命令行,所以我没有正确的术语,但是当我输入您的示例并按enter键时,它会转到一个带有“>”的新行,因此我必须按住ctrl+c键才能返回提示。知道吗?我希望历史不是问题。您丢失了所有内容,重命名后将再次丢失所有内容。感谢您的关注,但历史记录不是问题,这是来自外部供应商的html文件转储,我们只是每季度更换一次。无法恢复其提交,因为这是来自外部供应商的更新转储。所以优先权是过时的文件。哦,杜德也刚刚退出,因此我现在必须修复它。这更好,因为它不依赖于shell将
    *
    扩展到目录中的所有文件。这会在没有任何警告的情况下重载命令行。是的,命令行非常大,但是当它发生时,您只剩下一组部分重命名的文件,并且没有警告命令没有完成分配给它的任务。
    ./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
    )