Тряхнуть стариной

Nov 19, 2022 19:41

По случаю потребовалось переименовать для тупого mp3-плеера русскоязычные имена файлов в транслит. Про тэги - просто не спрашивайте.  Видимо, тот их в принципе не понимает. Помню, что много лет назад как-то с такой задачей довольно просто справился. Теперь вот пытался вспомнить. Прежде всего, обломался об iconv //TRANSLIT - тот делает непонятно что и непонятно кому нужную бессмысленную операцию по замене русских букв на ?. Потом нашёл, что есть такая перловая утилита translit, которая показала мне, что есть разные стандартные формы транслита, но не все одинаково полезные в моём случае. Например, DIN 1460 RUS преобразовал
  Чайковский Лебединое озеро.mp3
в
  Čajkovskij Lebedinoe ozero.mp3
Ну... такой себе результат.  Дело в неприметной крышечке над первой буквой, которая для какого-нибудь ISO-8859-1 может и сойдет, а для этого плеера - не факт.
Вариант GOST 7.79 RUS давал существенно лучший результат:
  Chajkovskij Lebedinoe ozero.mp3
Однако на других элементах обучающей выборки обнаружились небольшие неудобства в виде кавычек разного вида:
  shostakovich tancy' kukol val`s.mp3
Поскольку финальным аккордом предполагалось переименовывать файлы командой mv, возиться с экранированием всего этого хозяйства совсем не хотелось.  Поэтому пришлось просто от них избавиться. В итоге получилось примерно вот такая последовательность действий. Сначала сделать каталоги с новыми именами:
  find ./ -type d | translit -t "GOST 7.79 RUS" | awk '{gsub(/[`\047]/, "");print}' | xargs -i mkdir '{}'
Потом сделать начало списка команд переименования:
  find ./ -type f | xargs -i echo mv \"{}\" >head.txt
Сделать конец команд переменования с транслитеррированными именами каталогов и файлов:
  find ./ -type f | translit -t "GOST 7.79 RUS" | awk '{gsub(/[`\047]/, "");printf("\"%s\"\n", $0)}' >tail.txt
Ну и выполнить искомое действие:
  paste head.txt tail.txt >cmd.sh
  sh -x cmd.sh

#translit

#translit, линуксизмы, linux

Previous post
Up