我们在Linux服务器上运行颠覆。 当我们组织中的某人需要全部使用小写字母时,他们将大约3k个文件混合使用。
这在CLI中起作用
rename 'y/AZ/az/' *
但显然会搞砸颠覆。
svn rename 'y/AZ/az/' *
不行,因为颠覆处理重命名不同,我猜。 那么我怎样才能做到批量工作? 我吮吸CLI,所以请解释它,就像我是你的父母。 重新命名所有3k文件不是我想要承担的任务。
谢谢
for src in *; do dst=$(echo "$src" | tr '[AZ]' '[az]') [ "$src" = "$dst ] || svn rename "$src" "$dst" done
怎么运行的:
||
的单线条件 很常见。 如果你需要递归,你可以创建一个小脚本svn-lowername.sh
(上面的一个小的变体):
#!/bin/bash for src; do dst=$(echo "$src" | tr '[AZ]' '[az]') [ "$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 *
这有点不好意思,但应该处理任何数量的嵌套目录:
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版本库的pre-commit钩子中实现case-insenstive.py脚本。 下次有人试图添加一个不同大小写的文件时,pre-commit钩子不会让他们。