如何在Subversion中将文件批量重命名为小写?
我们在Linux服务器上运行颠覆。当我们组织中的某个人需要全部小写时,他们将大约3k个文件以混合大小写覆盖。如何在Subversion中将文件批量重命名为小写?
这工作在CLI
rename 'y/A-Z/a-z/' *
但显然会搞砸了颠覆。
svn rename 'y/A-Z/a-z/' *
不工作,因为颠覆处理不同的重命名我猜。那么我怎样才能做到批量工作呢?我吮吸CLI,所以请解释它,就像我是你的父母。重命名所有3k文件不是我想要承担的任务。
感谢
for src in *; do
dst=$(echo "$src" | tr '[A-Z]' '[a-z]')
[ "$src" = "$dst ] || svn rename "$src" "$dst"
done
工作原理:
- 遍历源文件名。
- 目标文件名是小写的源文件名。 tr按字符翻译进行字符翻译。
- 如果源文件名和目标文件名相同,我们可以,否则,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 *
`*`不会递归通过子目录,但会执行@ invertedSpear的第一个示例。他可能想要找到。或类似的。 – nmichaels 2010-11-29 19:47:51
这是一个有点哈克,但应在任意数量的嵌套目录的工作:
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存储库的预提交钩子中实现case-insenstive.py脚本。下次有人试图添加一个不同大小写的文件时,pre-commit钩子不会让它们。
我希望历史不是问题。你已经失去了一切,重新命名后将再次失去它。 – jgifford25 2010-11-29 19:57:33
感谢您的关注,但历史不是问题,它是外部供应商提供的html文件的转储,无论如何我们只是按季度更换一次。 – invertedSpear 2010-11-29 19:59:32