我们在一个Linux服务器上运行subversion。我们组织中的某个人用混合大小写覆盖了大约3k的文件,当它们需要全部小写时。这在CLI中有效
rename 'y/A-Z/a-z/' *
但显然会搞砸颠覆。
svn rename 'y/A-Z/a-z/' *
不工作,因为subversion处理重命名不同,我猜.所以我怎么能做这个作为一个批处理作业?我吸与CLI,所以请解释它像我是你的父母.手动重命名所有3k文件不是一个任务,我希望承担.谢谢
myss37ts1#
创建一个小脚本svn-lowername.sh:
svn-lowername.sh
#!/bin/bash # svn rename each supplied file with its lowercase for src; do dst="$(dirname "$src")/$(basename "$src" | tr '[A-Z]' '[a-z]')" [ "$src" = "$dst" ] || svn rename "$src" "$dst" done
确保chmod +x svn-lowername.sh。然后执行:工作原理:1.循环遍历每个提供的文件名。1.文件名的基本名部分是小写的,目录部分则保持不变,使用tr进行逐个字符的转换。(如果需要支持非ASCII字母,则需要进行更精细的Map。)1.如果源文件名和目标文件名相同,我们就可以了,否则,svn rename。(您可以使用if语句来代替,但是对于单行条件语句,使用||是非常惯用的。)您可以对目录中的所有文件使用此选项:
chmod +x svn-lowername.sh
tr
svn rename
||
./svn-lowername.sh *
...或者如果您想递归执行:
find -name .svn -prune -o -type f -print0 | xargs -0 ./svn-lowername.sh
如果您认为这个问题可能会再次发生,请将svn-lowername.sh隐藏在您的路径中的某个位置(~/bin/可能是一个很好的位置),然后您可以在运行它时丢失./前缀。
~/bin/
./
fkvaft9z2#
这有点笨拙,但应该可以用于任意数量的嵌套目录:
find -mindepth 1 -name .svn -prune -o -print | ( while read file; do svn mv "$file" "`perl -e 'print lc(shift)' "$file"`" done )
此外,您也可以还原他们的提交。谨慎的做法可能是以4为单位管理线索。
mefy6pfw3#
在Subversion中重命名需要两个步骤,如果你想保留历史记录,一个svn copy接着一个svn delete.如果你使用svn move,你会丢失文件的历史记录.虽然这个答案对你的问题没有帮助,但它可以帮助你避免这种情况再次发生.在Subversion仓库的pre-commit钩子中实现case-insenstive.py脚本,下次有人试图添加大小写不同的文件时,pre-commit钩子不会允许.
svn copy
svn delete
svn move
3条答案
按热度按时间myss37ts1#
创建一个小脚本
svn-lowername.sh
:确保
chmod +x svn-lowername.sh
。然后执行:工作原理:
1.循环遍历每个提供的文件名。
1.文件名的基本名部分是小写的,目录部分则保持不变,使用
tr
进行逐个字符的转换。(如果需要支持非ASCII字母,则需要进行更精细的Map。)1.如果源文件名和目标文件名相同,我们就可以了,否则,
svn rename
。(您可以使用if语句来代替,但是对于单行条件语句,使用||
是非常惯用的。)您可以对目录中的所有文件使用此选项:
...或者如果您想递归执行:
如果您认为这个问题可能会再次发生,请将
svn-lowername.sh
隐藏在您的路径中的某个位置(~/bin/
可能是一个很好的位置),然后您可以在运行它时丢失./
前缀。fkvaft9z2#
这有点笨拙,但应该可以用于任意数量的嵌套目录:
此外,您也可以还原他们的提交。谨慎的做法可能是以4为单位管理线索。
mefy6pfw3#
在Subversion中重命名需要两个步骤,如果你想保留历史记录,一个
svn copy
接着一个svn delete
.如果你使用svn move
,你会丢失文件的历史记录.虽然这个答案对你的问题没有帮助,但它可以帮助你避免这种情况再次发生.在Subversion仓库的pre-commit钩子中实现case-insenstive.py脚本,下次有人试图添加大小写不同的文件时,pre-commit钩子不会允许.