UTF8 локаль в ArchLinux

Дизель выложил в свое время замечательную ссылочку на форуме по поднятию UTF8 локали в Arch Linux

Здесь я хочу что бы все желающие выдавали свои дополнения, оформенные в виде статьи.

Итак, положим начало...

Имена файлов

На старой koi8-r системе было довольно приличное количество файлов в русскими именами, естественно в кодировке koi8-r. Что делать, в UTF локали с такими именами файлов работать несподручно...

На решение проблемы навел запуск такой команды:

LANG=ru_RU.KOI8-R ls | iconv -f koi8-r

Эта команда вывела список имен файлов с русскими именами как и положено, русскими буковками. Так родился скрипт:

#!/bin/bash

#
# Recode all file names in given codepage to UTF8
# on UTF8 system
#

CODE_FROM="KOI8-R"
recursive=0
scan_only=0

function parse_cmd_line()
{
    prev_arg=""
    need_next=0
    for i in "$@"
    do
    if [ $need_next -eq 0 ]; then
        case $i in
        "-f")
        prev_arg="-f"
            need_next=1
        ;;
        "-r")
        recursive=1
        ;;
        "-s")
        scan_only=1
        ;;
        esac
    else
        case $prev_arg in
        "-f")
        CODE_FROM=`echo $i | tr '[:lower:]' '[:upper:]'`
        ;;
        esac
        prev_arg=""
        need_next=0
    fi
    done
}

function recode_file()
{

    old_name="$@"
    new_name=`echo $@ | iconv -f $CODE_FROM`
    stat1=$?
    mid_name=`echo $@ | iconv -f UTF8 2>/dev/null`
    stat2=$?

    if [ x"$old_name" != x"$new_name" -a $stat1 -eq 0 -a x"$mid_name" != x"$old_name" ]; then
    if [ $scan_only -eq 0 ]; then
        echo "Recode: $old_name -> $new_name"
        mv "$old_name" "$new_name"
    else
        echo `pwd`"$@"
    fi
    fi
}

parse_cmd_line $@

oldIFS=$IFS
IFS=$'\n'
files=`ls -1 --color=none`
for i in $files
do
    if [ -d "$i" ]; then
    if [ $recursive -eq 1 ]; then
        name=`basename $0`
        if [ `dirname $0` == "." ]; then
        prefix=`pwd`
        else
        prefix=`dirname $0`
        fi
        cd "$i"

        $prefix/$name "$@"

        cd ..
    fi
    fi

    recode_file "$i"
done

Запускам сей скрипт из директории содержимое которой нужно привести к виду UTF8:

recodedir

Скрипт понимает ключи:

  • -r говорит что перебрать все каталоги рекурсивно, начиная с текущего
  • -s просканирует каталоги и выдаст список файлов которые нужно изменять
  • -f <кодировка> задает кодировку из которой перекодировать, по умолчанию KOI8-R

Кроме того, можно использовать готовую утилиту "convmv" из репозитория "extra". Умеет она намного больше, чем вышеописанный скрипт, но требует установленный perl в системе.

Midnight Commander

Есть два вариант, mc-utf8 из репозитария community либо вот этот образец: http://pupykins.googlepages.com/mc.html

Автор mc-cru и автор порта в community - суть один человек, имя ему Сергей Пупыкин (надеюсь правильно написал фамилию) в том виде в котором идет mc-cru очень нелицеприятный. Что бы привести его в чувство, смержил utf8 патч с той версии что в репозитарии, плюс сделал пееркодировку в редакторе (но тут кроется бага... страшная, которую пока лень решать, при перекодировке в редакторе не работает поиск и замена).