LINUX.ORG.RU
решено ФорумTalks

[veschestva]Быстренько в транслит


0

0

Чуть-чуть вещества:
как быстро имена кучи файлов
и каталогов перевести в транслит.
Какие-нибудь костыли с iconv
или может быть есть готовые решения?
Имена кириллический в самых разных
кодировках, большинство в koi8-r и utf-8


Ответ на: комментарий от fluorite

>однострочник на Perl же!

Пробовал конечно. Не помогло.

dera
() автор топика

man koi8-r

Просто убираешь старший байт символа. Получаешь эквивалент в транслите.

В общем небольшая прога на Си. Может и на баше можно, тока я им не владею

dragonfly
()
Ответ на: комментарий от dera

И, да, а чего с утфными делать?

Если уж убирать старший бит то, очевидно, сперва перевести в KOI8-R через iconv?

bibi
()
Ответ на: комментарий от dera

Дык, я ж говорю косячный способ. А так наверно скрипт на баше можно придумать. Только я в этом не смыслю

dragonfly
()


А вообще Use google, Like
$ google 'translit perl'

bibi
()
Ответ на: комментарий от fluorite

Да это не принципиально, тащемта.
Надо бы быстренько с этим разобраться,
а сейчас за си садиться и разбираться.
Хотя не спорю, наверное самый нормальный
вариант будет.

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

Уже тащемта так и сделал:

for FILE in *
do
    TARGET=`echo -n ${FILE// /} | iconv -t koi-7 | tr [:upper:] [:lower:]`
    mv "$FILE" "$TARGET"
done
Но все равно спасибо

dera
() автор топика

Про rename никто не вспомнил? Запускать в цикле что-то вроде rename ш sh «*ш*» пока находит имена с буквой ш.

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

> И чо, мне так для каждой буквы делать?

Да. В цикле for. А подстановку через case. Длинно, зато результат читается лучше, чем замены ч->` и я->q. Но если нужна обратимость преобразования, то способ не годится.

for letter in а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я
  do
  case $letter in
    а | А ) r=a;;
    б | Б ) r=b;;
    в | В ) r=v;;
    г | Г ) r=g;;
    д | Д ) r=d;;
    е | Е ) r=ye;;
    ё | Ё ) r=yo;;
    ж | Ж ) r=zh;;
    з | З ) r=z;;
    и | И ) r=i;;
    й | Й ) r=y;;
    к | К ) r=k;;
    л | Л ) r=l;;
    м | М ) r=m;;
    н | Н ) r=n;;
    о | О ) r=o;;
    п | П ) r=p;;
    р | Р ) r=r;;
    с | С ) r=s;;
    т | Т ) r=t;;
    у | У ) r=u;;
    ф | Ф ) r=f;;
    х | Х ) r=h;;
    ц | Ц ) r=ts;;
    ч | Ч ) r=ch;;
    ш | Ш ) r=sh;;
    щ | Щ ) r=sch;;
    ъ | Ъ ) r=\';;
    ы | Ы ) r=y;;
    ь | ь ) r=\';;
    э | Э ) r=e;;
    ю | Ю ) r=yu;;
    я | Я ) r=ya;;
  esac;
  while ls -d *$letter* &>/dev/null;
    do
    rename $letter $r *$letter*;
  done;
done

Или в 1 строку:

for letter in а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я; do case $letter in  а | А ) r=a;; б | Б ) r=b;; в | В ) r=v;; г | Г ) r=g;; д | Д ) r=d;; е | Е ) r=ye;; ё | Ё ) r=yo;; ж | Ж ) r=zh;; з | З ) r=z;; и | И ) r=i;; й | Й ) r=y;; к | К ) r=k;; л | Л ) r=l;; м | М ) r=m;; н | Н ) r=n;; о | О ) r=o;; п | П ) r=p;; р | Р ) r=r;; с | С ) r=s;; т | Т ) r=t;; у | У ) r=u;; ф | Ф ) r=f;; х | Х ) r=h;; ц | Ц ) r=ts;; ч | Ч ) r=ch;; ш | Ш ) r=sh;; щ | Щ ) r=sch;; ъ | Ъ ) r=\';; ы | Ы ) r=y;; ь | ь ) r=\';; э | Э ) r=e;; ю | Ю ) r=yu;; я | Я ) r=ya;; esac; while ls -d *$letter* &>/dev/null; do rename $letter $r *$letter*; done; done

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