Автор Гілка: Транслітерація імен файлів  (Прочитано 6550 раз)

Відсутній ivaniura

  • Новачок
  • *
  • дописів: 20
  • Карма: +0/-0
    • Андрій Іванюра - Музика і технології як одне ціле
Всім привіт! Знайшов у неті та трохи підправив під себе скрипт автоматичної транслітерації імен файлів з кирилиці в латинку. Ось так він виглядає:
#!/bin/bash
shopt -s nullglob
for NAME in * ; do
 TRS=`echo $NAME | sed "y/абвгґдезиійклмнопрстуфхц/abvggdezyijklmnoprstufhc/"`
 TRS=`echo $TRS | sed "y/АБВГҐДЕЗИІЙКЛМНОПРСТУФХЦ/ABVGGDEZYIJKLMNOPRSTUFHC/"`
 TRS=${TRS//ч/ch};
 TRS=${TRS//Ч/Ch};
 TRS=${TRS//ш/sh};
 TRS=${TRS//Ш/Sh};
 TRS=${TRS//ж/zh};
 TRS=${TRS//Ж/Zh};
 TRS=${TRS//щ/shch};
 TRS=${TRS//Щ/Shch};
 TRS=${TRS//є/je};
 TRS=${TRS//Є/Je};
 TRS=${TRS//ї/ji};
 TRS=${TRS//Ї/Ji};
 TRS=${TRS//ю/ju};
 TRS=${TRS//Ю/Ju};
 TRS=${TRS//я/ja};
 TRS=${TRS//Я/Ja};
 TRS=${TRS//ь/\'};
 TRS=${TRS//Ь/\'}
 if [[ `file -b "$NAME"` == directory ]]; then
 mv -v "$NAME" "$TRS"
 cd "$TRS"
 "$0"
 cd ..
 else
 mv -v "$NAME" "$TRS"
 fi
done
Тепер мені потрібно написати скрипт, який буде проводити транслітерацію в зворотному порядку, тобто з латинки в кирилицю. Руки опустилися на наступному варіанті:
#!/bin/bash
shopt -s nullglob
for NAME in *.mp3 ; do
 TRS=${TRS//je/є};
 TRS=${TRS//Je/Є};
 TRS=${TRS//zh/ж};
 TRS=${TRS//Zh/Ж};
 TRS=${TRS//ji/ї};
 TRS=${TRS//Ji/Ї};
 TRS=${TRS//shch/щ};
 TRS=${TRS//Shch/Щ};
 TRS=${TRS//ch/ч};
 TRS=${TRS//Ch/Ч};
 TRS=${TRS//sh/ш};
 TRS=${TRS//Sh/Ш};
 TRS=${TRS//ju/ю};
 TRS=${TRS//Ju/Ю};
 TRS=${TRS//ja/я};
 TRS=${TRS//Ja/Я};
 TRS=${TRS//\'/ь};
 TRS=`echo $NAME | sed "y/abvggdezyijklmnoprstufhc/абвгґдезиійклмнопрстуфхц/"`
 TRS=`echo $TRS | sed "y/ABVGGDEZYIJKLMNOPRSTUFHC/АБВГҐДЕЗИІЙКЛМНОПРСТУФХЦ/"`
 if [[ `file -b "$NAME"` == directory ]]; then
 mv -v "$NAME" "$TRS"
 cd "$TRS"
 '$0'
 cd ..
 else
 mv -v "$NAME" "$TRS"
 fi
done
Проблеми:
  • Багатосимвольні заміни не відбуваються (фраза "Horosha pisnja" транслітерується як "Хоросха піснйа").
  • З назвою файла транслітерується і розширення, а цього потрібно уникнути.
  • Було б непогано вказати конкретні типи файлів, які потрібно транслітерувати.
Хто підкаже, куди копати?

Миха́йло Даниленко

  • Гість
Re: Транслітерація імен файлів
« Відповідей #1 : 2017-09-11 23:14:55 »
Ви берете змінну NAME, і намагаєтесь у кінці отримати у TRS транслітеровану її версію. Для цього треба

1) присвоїти TRS значення NAME
2) виконати якісь операції над TRS

Що й робив початковий скрипт. Ви ж переставили операції місцями, в результаті у вас іде транслітерація на порожній TRS, потім в самому кінці їй присвоюється значення NAME і проганяється через sed.

Тобто вам треба перше входження TRS з правої сторони від = поміняти на NAME, а NAME у рядку з sed поміняти навпаки на TRS.

Щоб транслітерація не відбувалася на розширенні — вам треба або його прибирати перед транслітерацією (щось типу ${NAME%.mp3}), або ж конвертувати назад вже після транслітерації (знайома операція заміни ${TRS/.../...}).

Також ви замінили лапки навколо $0 на одинарні. Цього не треба робити — одинарні лапки позначають рядок, в якому не відбувається розкриття змінних ($...).

Зауважу, що ваша версія скрипта іде рекурсивно по директоріям, але лише по тим, що закінчуються на '.mp3'.

Загалом якість коду (і оригіналу теж) [smiley=suicide.gif]