【发布时间】:2020-07-11 05:01:43
【问题描述】:
如果我可以使用重命名命令就更好了。但我认为我们必须使用两个正则表达式。
% 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
我figured out我们可以使用
for file in ./* ; do mv "$file" "$(echo $file|sed -e 's/\([A-Z]\)/-\L\1/g' -e 's/^.\/-//')" ; done
但是这个命令有很多问题。
- 它对文件和目录都进行操作。我只想重命名目录
- 它不会递归循环。
- 如果 kebab case 文件名已经存在,则显示
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
【问题讨论】:
-
请在您的问题中添加示例文件名(无描述、无图像、无链接)和该示例输入所需的文件名(无评论)。
-
这可能对 GNU sed 有所帮助:
sed 's/[A-Z]/-\L&/g; s/^-//'