我们正在Linux服务器上运行subversion。当他们需要全部小写时,我们组织中的某人用大小写混合了约3k文件。
这适用于CLI
rename 'y/A-Z/a-z/' *
但显然会破坏颠覆。
svn rename 'y/A-Z/a-z/' *
不起作用,因为subversion处理重命名的方式不同我想。那么我怎么能做这个批处理工作呢?我很熟悉CLI,所以请解释一下我就像你的父母一样。手动重命名所有3k文件不是我想要承担的任务。
由于
答案 0 :(得分:7)
for src in *; do
dst=$(echo "$src" | tr '[A-Z]' '[a-z]')
[ "$src" = "$dst ] || svn rename "$src" "$dst"
done
工作原理:
||
的单行条件非常常见。如果您需要递归,可以创建一个小脚本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脚本。下次有人尝试添加具有不同案例的文件时,预提交挂钩将不允许它们。