以递归方式将目录从 pascal 或camel case 重命名为kebab case [英] Rename directories recursively from pascal or camel case to kebab case
本文介绍了以递归方式将目录从 pascal 或camel case 重命名为kebab case的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如果我可以使用重命名命令就更好了.但我认为我们必须使用两个正则表达式.
It would be best if I could just use the rename command. But I think we have to use two regex.
正在运行的 sed 命令是
% echo MyExPression | sed --expression 's/\([A-Z]\)/-\L\1/g' --expression 's/^-//'
my-ex-pression
% echo myExPression | sed --expression 's/\([A-Z]\)/-\L\1/g' --expression 's/^-//'
my-ex-pression
我发现我们可以使用
for file in ./* ; do mv "$file" "$(echo $file|sed -e 's/\([A-Z]\)/-\L\1/g' -e 's/^.\/-//')" ; done
但是这个命令有多个问题.
But this command has multiple problems.
- 它同时作用于文件和目录.我只想重命名目录
- 它不会递归循环.
- 如果 kebab case 文件名已经存在,那么它说
mv: 不能将 './first-folder-to-rename' 移动到自身的子目录,'./first-folder-to-rename/first-folder-to-rename'
那么,这里的解决方案是什么?
So, what might be the solution here?
更新 1
这是一个示例目录结构
% tree
.
├── EmptyFile.txt
├── FirstDirectoryName
│ ├── FourthDirectoryName
│ ├── secondDirectoryName
│ └── thirdDirectoryName
├── FourthDirectoryName
├── secondDirectoryName
└── thirdDirectoryName
预期输出
% tree
.
├── EmptyFile.txt
├── first-directory-name
│ ├── fourth-directory-name
│ ├── second-directory-name
│ └── third-directory-name
├── fourth-directory-name
├── second-directory-name
└── third-directory-name
推荐答案
zsh:
autoload -Uz zmv
zmv -n -Q '**/|*[[:upper:]]*(/od)' \
'${(M)f##*/}${(L)${${f##*/}//(#b)([[:upper:]])/-$match[1]}#-}'
如果输出正确,则删除 -n
.
remove -n
if output is correct.
这篇关于以递归方式将目录从 pascal 或camel case 重命名为kebab case的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文