LINUX.ORG.RU

[bash][sed] Переименовать папки

 ,


0

1

Нужно переименовать папки так, чтобы первая буква имени была заглавной. Простая задача, а у меня сейчас мозг закипит...

Вот последний варик:

find -type d -exec mv "{}" "`echo {} | sed 's/[а-я]/\u&/g'`" \;

Ну что тут не так? Почему сыплет что-то типа : «mv: невозможно перенести «./ДЕСЕРТЫ/штрудель с вишней» в свой собственный подкаталог, «./ДЕСЕРТЫ/штрудель с вишней/штрудель с вишней»»?

Каким боком добавил он ещё одну папку и почему регистр не поднял?

★★★★★

Папку переименовывают в ЗАГСе, с его обязательным участием.

А {} во второй команде не будут восприниматься.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Obey-Kun

Очень не просто:

Вижу я выхлоп и что? Все как работало непонятно, так и работает. Регистр не изменяется. В выхлопе повтора имени последней папки нет. При этом регистр изменяется если просто взять

$ echo "./ДЕСЕРТЫ/чизкейк классический" | sed 's/[а-я]/\u&/'
./ДЕСЕРТЫ/Чизкейк классический

А при выполнении таки добавляется имя пследней папки еще раз.

Suntechnic ★★★★★
() автор топика

Вот:

find . -type d | while read file; do mv "$file" $(echo "$file" | sed 's/[[:alpha:]]/\u&/g'); done
(проверял с echo, с mv неохота проверять)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Suntechnic

Это же элементарно, Ватсон: vidir, <hjkl>, Ctrl-V, выделяешь первые буквы, gU, :x, profit

t184256 ★★★★★
()
Ответ на: комментарий от Suntechnic

А латинницу? И вообще, правильнее, например, так:

for Name in $(ls -1)
do
    Newname=`echo "$Name"|enconv|sed -e \
    "y/йукенгзхъфывапролдэсмитьбЙУКЕНГЗХЪФЫВАПРОЛДЭСМИТЬБ/jukengzh'fyvaproldesmit'bJUKENGZH'FYVAPROLDESMIT'B/"\
    -e "s/ц/tz/g"	\
    -e "s/ш/sh/g"	\
    -e "s/щ/sch/g"	\
    -e "s/ж/zh/g"	\
    -e "s/ч/ch/g"	\
    -e "s/ю/yu/g"	\
    -e "s/я/ya/g"	\
    -e "s/ё/yo/g"	\
    -e "s/Ё/YO/g"	\
    -e "s/Ц/TZ/g"	\
    -e "s/Ш/SH/g"	\
    -e "s/Щ/SCH/g"	\
    -e "s/Ж/ZH/g"	\
    -e "s/Ч/CH/g"	\
    -e "s/Ю/YU/g"	\
    -e "s/?/_/g"	\
    -e "s/Я/YA/g"`
    if [ "$Name" != "$Newname" ]; then
        mv "$Name" "$Newname"
	echo -e "$Name   ->    $Newname                             \r\c"
    fi
    if [ -d "$Newname" ]; then
	cd "$Newname"
	echo -e "\n\nDiving into $Newname"
	rename_translit
	cd ../
    fi
done

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

>Откуда ж я знаю? Сам на такие грабли уже наступал.

Это потому что сначала bash видит конструкцию внутри ``, выполняет её (поэтому не парсится {}, т.к. это парсит не find, а bash, потому что внутри ``), результат подставляет в командную строку find. Т.е. {} обрабатываются не find'ом, а bash'ем.

gentoo_root ★★★★★
()

> Каким боком добавил он ещё одну папку и почему регистр не поднял?

Ну тут просто, он делает mv "./ДЕСЕРТЫ/штрудель с вишней" "./ДЕСЕРТЫ/штрудель с вишней" (пытается добавить каталог в себя самого).

Obey-Kun ★★★★★
()
Ответ на: комментарий от Eddy_Em

Апает все буквы. Если убрать g то только первую как и надо, но трабла в том, что есть некоторые каталоги уже названные с большой буквы - в итоге имеем «КЕкс Муале» например...

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

find -type d | while read i; do echo mv «$i» «`echo $i | sed 's/\/[а-я]/\U&/'`»; done

Вроде сработало.

Пропустило только то у чего в начале (ну это понятно) и в конце (что странно) пробел.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Не - мне же в имени папки, значит надо / а не начало строки.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

Да - сработало!

Спасибо, всем!

Перехожу теперь к содержимому (текстовые файлы с описанием) - борьба с плодами гуманитарного ума продолжается...

Suntechnic ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.