2011-11-16 4 views
0

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

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

Любые предложения? Благодаря

ответ

1

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

find testdir/ -depth | while read file; do NEWNAME=$(dirname "$file")/$(echo $(basename "$file") | tr '[:lower:]' '[:upper:]'); mv "$file" "$NEWNAME"; done 
+0

Я пытался использовать ваш первый скрипт, но меняет только первый «уровень» дерева папок. Если у меня есть, например, DocumentsFolder-JobFolder-Test.txt, после выполнения у меня есть DOCUMENTFOLDER-JobFolder-Test.txt. Я хочу прописную букву для всех папок, подпапок и файлов, таких как DOCUMENTFOLDER-JOBFOLDER-TEST.TXT. – Ant4res

+0

Извините, я исправил код. Он должен работать сейчас, как ожидалось. – johnbaum

+0

Спасибо! Оно работает! – Ant4res

1

Проблема заключается в том, что ваша команда в обратные кавычки, 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"`"' {} \; 

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

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

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

+0

Спасибо за объяснение ... Я попытался запустить скрипт, но я получаю много синтаксических ошибки и никаких изменений в папке подпапки и именах файлов – Ant4res

+0

Похоже, вы получили свой ответ другими способами, но для записи исходный код не работал должным образом в именах файлов с пробелами, что может быть проблемой. Я исправил это сейчас. После того, как вы встанете на это множество уровней цитирования, петлевое решение начинает выглядеть довольно хорошо, действительно ;-) –

+0

Спасибо за ваш ответ! Но что означает <<< $ 0? – Ant4res

Смежные вопросы