Было бы лучше, если бы я мог просто использовать команду переименования. Но я думаю, что нам нужно использовать два регулярных выражения.
Команда 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
Но эта команда имеет несколько проблем.
- Она работает как с файлами, так и с каталогами. Я хочу переименовать только каталоги
- Это не l oop рекурсивно.
- Если имя файла для кебаба уже есть, то в нем написано
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