以递归方式将目录从 pascal 或camel case 重命名为kebab case [英] Rename directories recursively from pascal or camel case to kebab case

查看:37
本文介绍了以递归方式将目录从 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.

  1. 它同时作用于文件和目录.我只想重命名目录
  2. 它不会递归循环.
  3. 如果 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆