bash - 将目录从pascal或camel case递归重命名为kebab case
问题描述
如果我可以只使用重命名命令,那将是最好的。但我认为我们必须使用两个正则表达式。
正在工作的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
但是这个命令有很多问题。
- 它对文件和目录都进行操作。我只想重命名目录
- 它不会递归循环。
- 如果烤肉串案例文件名已经存在,那么它会说
mv: cannot move './first-folder-to-rename' to a subdirectory of itself, './first-folder-to-rename/first-folder-to-rename'
那么,这里的解决方案可能是什么?
更新 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
如果输出正确则删除。
推荐阅读
- c# - 异步任务
返回“字符串”不包含定义 - javascript - 是否可以在 Swiper.js 的导航按钮上添加延迟功能?
- wso2 - WSO2 APIM 3.0.0:安装证书后无法从 /publisher 和 /devportal 登录
- android - 如何减少 Workmanager Android 的时间周期?
- node.js - 为什么 Nodejs 会抛出一个名为:TypeError: user.comparePassword is not a function 的错误?
- python - 如何在没有管理员权限的情况下创建 Python COM 服务器?
- python - 如何检查给定的整数列表是否是系列的一部分?
- java - 如何在撇号之间获取字符串字符
- javascript - 想要将单选按钮 html 中选择的值传递给控制器 javascript
- python - 避免循环后重复代码的优雅方法