zmv - 将目录从 kebab 大小写递归重命名为 pascal 大小写

zmv - rename directories recursively from kebab case to pascel case

我正在使用以下 将文件从 camel 或 pascal 重命名为 kebab 大小写,因为我们将忽略连续的大写字母。

function CamelOrPascalToKebab() {

    zmv -Q '(**/)(*[A-Z]*)(/)' '${2//(#b)([a-z])([A-Z])/$match[1]-$match[2]}'
    zmv -Q '(**/)(*[A-Z][a-z]*)(/)' '${2//(#m)[A-Z][a-z]/${(L)MATCH}}'

}

所以,对于下面的目录结构

% tree
.
├── DDDDDD
├── EmptyFile
├── EmptyFile.adoc
├── FirstDirToRename
│   ├── DDDDDD
│   ├── EmptyFile
│   ├── EmptyFile.adoc
│   ├── fourthDirToRename
│   ├── SecondDirToRename
│   └── ThisIsDDDDD
├── fourthDirToRename
├── SecondDirToRename
└── ThisIsDDDDD

函数后的目录结构是运行是

% tree
.
├── DDDDDD
├── EmptyFile
├── EmptyFile.adoc
├── first-dir-to-rename
│   ├── DDDDDD
│   ├── EmptyFile
│   ├── EmptyFile.adoc
│   ├── fourth-dir-to-rename
│   ├── second-dir-to-rename
│   └── this-is-DDDDD
├── fourth-dir-to-rename
├── second-dir-to-rename
└── this-is-DDDDD

现在我需要一个函数来返回到之前的结构。

我觉得流程应该很简单

  1. 首字母大写
  2. -
  3. 之后的每个字符大写
  4. 全部删除-

我正在尝试将文件名的第一个字符大写

function KebabToPascal () {
    zmv -n -Q '(**/)(*-*)(/)' '${(U)2:0:1}${2#?}'
}

正在工作。

完整的 KebabToPascal 函数是什么样的?

将文件从 kebab 大小写重命名为 pascal 大小写的功能

function kebab-to-pascal () {
    zmv -Q '(**/)(*-*)(/)' '${(U)2:0:1}${2#?}'
    zmv -Q '(**/)(*-[a-z]*)(/)' '${2//(#m)-[a-z]/${(U)MATCH}}'
    zmv -Q '(**/)(*-*)(/)' '${2//-##/}'
}