Замена иностранных символов английскими эквивалентами в именах файлов с помощью сценария UNIX Bash

Я пытаюсь использовать sed для обработки списка имен файлов и замены каждого иностранного символа в имени файла английским эквивалентом. Например.

Малага.txt -> Малага.txt

Мой сценарий следующий:

    for f in *.txt 
do
    newf=$(echo $f | sed 'y/āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛ/aaaaeeeeiiiioooouuuuüüüüAAAAEEEEIIIIOOOOUUUUÜÜÜÜ/')
    mv $f $newf
done

В настоящее время это не влияет на имена файлов. Однако, если я использую одно и то же регулярное выражение для обработки текстового файла. Например.

cat blah.txt | sed 'y/āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛ/aaaaeeeeiiiioooouuuuüüüüAAAAEEEEIIIIOOOOUUUUÜÜÜÜ/

Работает отлично - все иностранные символы заменены на их английские эквиваленты. Любая помощь будет принята с благодарностью. Это на Mac OSX в оболочке UNIX.


person Binaromong    schedule 18.05.2016    source источник
comment
Мило, но скажите мне, что такое иностранные символы? ;)   -  person sjsam    schedule 18.05.2016
comment
Я имею в виду такие символы, как эти:   -  person Binaromong    schedule 18.05.2016
comment
Я имел в виду, что чужой для вас язык может быть родным для кого-то другого. Вам не нужно объяснять дальше. Ваши вопросы довольно ясно показывают, чего вы пытаетесь достичь :)   -  person sjsam    schedule 18.05.2016
comment
У меня пока нет рецепта, как заставить его работать, но это может дать вам подсказку: похоже, это не работает, потому что эти символы представлены разными наборами байтов при отображении/вызове файла по сравнению с расширением ls/bash glob. echo -n 'Ã' | hexdump -C даст вам c3 83, когда ls'ing каталог с двумя файлами с именами Ã и a по какой-то причине даст вам 41 cc 83 вместо Ã. Надеюсь, поможет.   -  person Pavel Gurkov    schedule 18.05.2016
comment
@PavelGurkov: это потому, что в HFS+ имена файлов хранятся в NFD: developer.apple .com/library/mac/qa/qa1235/_index.html   -  person ninjalj    schedule 18.05.2016
comment
См.: developer.apple.com/legacy/library/technotes/ тн/   -  person ninjalj    schedule 18.05.2016
comment
Это может привести к эффективному удалению некоторых ваших файлов. Если у вас есть файл с именем a и другой файл с именем á, ваш файл a будет перезаписан.   -  person bdsl    schedule 29.07.2016


Ответы (1)


Это должно сделать это:

for f in *.txt; do
    newf=$(echo $f | iconv -f utf-8-mac -t utf-8 | sed 'y/āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛ/aaaaeeeeiiiioooouuuuüüüüAAAAEEEEIIIIOOOOUUUUÜÜÜÜ/')
    mv $f $newf
done

iconv -f utf-8-mac -t utf-8 преобразует текст из utf-8-mac в utf-8, что решает проблему предварительной компоновки/декомпозиции, обсуждавшуюся в комментариях @PavelGurkov и @ninjalj.

person leekaiinthesky    schedule 18.05.2016