Переименование папок, файлов и подпапок в bash - PullRequest
0 голосов
/ 16 ноября 2011

У меня проблема со скриптом bash ... Я хочу рекурсивно переименовать все файлы, папки и подпапки, из нижний регистр в верхний регистр (или наоборот). Я написал этот скрипт, но он не работает.

find . -depth -iname \* -exec mv {} `echo {} | tr [:upper:] [:lower:]` \;

Есть предложения? Спасибо

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

Почему бы не использовать простой цикл while:

find testdir/ -depth | while read file; do NEWNAME=$(dirname "$file")/$(echo $(basename "$file") | tr '[:lower:]' '[:upper:]'); mv "$file" "$NEWNAME"; done
1 голос
/ 16 ноября 2011

Проблема заключается в том, что ваша команда в обратных галочках, echo {} | tr [:upper:] [:lower:], сначала раскрывается оболочкой, так что find фактически видит в качестве аргументов

find . -depth -iname \* -exec mv {} {} \;

(выполнение tr [:upper:] [:lower:] на входе{} просто возвращает вам {} обратно).

Вот один из обходных путей, используя подоболочку в качестве команды -exec:

find . -mindepth 1 -depth -iname \* -exec \
    sh -c 'mv "$0" "`tr \[:upper:\] \[:lower:\] <<<"$0"`"' {}  \;

или более читабельно, используя $ () синтаксис:

find . -mindepth 1 -depth -iname \* -exec \
    sh -c 'mv "$0" "$(tr "[:upper:]" "[:lower:]" <<<$0)"' {}  \;

Обратите внимание, что вам также нужно заключить в кавычки tr диапазоны символов, чтобы остановить расширение их оболочкой!

Также неплохо добавить -mindepth 1, таквы не получаете ошибку при попытке запустить mv . ..

...