Перекодировка файлов в Unix

logoИногда, я бы даже сказал достаточно часто приходится заниматься перекодировкой файлов или названий файлов в ОС Unix. Хорошо когда у вас есть графический интерфейс и редактор типа kate, который позволяет без проблем конвертировать кодировки файлов. А если надо перекодировать название файлов? Или перекодировать само содержание файлов без графического интерфейса? Тут уже в помощь приходят команды Unix. И поверьте, набрать команду в консоле намного быстрее чем запускать какие-то редакторы кодировок и графические перекодировщики. А если для наиболее популярных перекодировок файлов написать исполняемые файлы с названием типа win2utf, то жизнь за консолью вам покажется очень простой 🙂

Перекодировка названий файлов

В данном примере приведу перекодировку из UTF8 в KOI8-R.
Скачиваем и устанавливаем программу convmv. Если в вашем репозитории данного пакета не обнаружилось, то скачать исходники можно отсюда.
Переходим в каталог, где нам надо изменить название файлов и вводим команду

convmv -t KOI8-R -f UTF-8 *

Смотрим что получилось:

./downloads/Сборник песен   - Братушки подводники# ./convmv -t KOI8-R -f UTF-8 *
Starting a dry run without changes...
mv "./п═п╣п╩п╦пЁп╦я▐ п©п╬п╢п╡п╬п╢п╫п╦п╨п╟.mp3"     "./Религия подводника.mp3"
mv "./п▓ п╠п╟п╥я┐.mp3"      "./В базу.mp3"

Если после выполнения команды можно прочесть название файлов, тогда делаем окончательную перекодировку, добавляя в конец команды “–notest”. Сделано это для того чтобы пользователь еще больше не закодировал итак непонятные символы. А вдруг вы ошиблись в исходной или конечной кодировке?
Теперь команда будет выглядеть

convmv -t KOI8-R -f UTF-8 *--notest

Если надо перекодировать рекурсивно каталоги, то добавляем в строку ключик -r и тогда можно за один проход перекодировать всю директорию с вложенными папками и подпапками. Остальные ключи программы можно посмотреть через команду

convmv --help

Перекодировка содержимого файлов

Чтобы не использовать графические редакторы можно использовать консольную программу перекодировщик, например такую как recode. Я считаю, что данная программа имеет очень логичный интерфейс и достаточно хорошо справляется с возложенной на нее задачей. Сначала установим программу recode, т.к. данная программа не входит в обязательный набор программ многих дистрибутивов.
Вот пример перекодировки файла из кодировки windows 1251 в utf8.

recode windows1251..utf8 <имя файла>

Опасность действий с recode поджидает тех, кто невнимателен, т.к. содержимое файла изменяется сразу же после команды. Заранее делайте копию перекодируемого файла, или делайте обратную перекодировку в том случае если ошиблись.

Также для перекодировки содержимого файла можно использовать команду iconv. Синтаксис данной команды немного посложнее. Пример перекодировки из  windows 1251 в utf8.

iconv -c -f windows-1251  -t UTF-8 имя_исходного_файла > имя_нового_файла

Обратите внимание на то, что в команде recode надо использовалась указание кодировки  windows1251 слитно, а в iconv надо писать через дефис.

Преимущество команды iconv в том, что она есть почти в каждом дистрибутиве unix и возможность создать новый выходной файл.

Ну и напоследок приведу пример скрипта, с помощью которого можно перекодировать название файлов из koi8r в utf8 с помощью recode.

#!/bin/sh

IFS=$'\n'
for x in `ls`
do
 echo $x
 mv "$x" `echo $x | recode koi8r..u8`
done

Перекодировка содержимого файла в транслит

Инсталлируем пакет yudit. Из всего пакета нам потребуется только утилита uniconv. Данная утилита имеет не совсем привычный синтаксис, но вполне подойдет для наших целей если задействовать вокруг неё команды unix

cat ./readme_koi8r |  uniconv -decode koi8-r -encode Russian-Translit > ./readme_translit

На выходе получаем файл с латиницей, а входной файл был в кодировке KOI8-R.

Многие действия команд convmv, recode, iconv и uniconv имеют много общего и фактически делают одно и то же. Так что используйте их в зависимости от вашего настроения и ситуации. И не забывайте про составление скриптов из этих команд.

Запись опубликована в рубрике Программы с метками , , . Добавьте в закладки постоянную ссылку.

4 комментариев Перекодировка файлов в Unix

  1. Yura говорит:

    Спасибо за статью.
    Скопировал файлы с NTFS диска на ext4
    Отображаются имена файлов как ???????????
    Из какой кодировки надо конвертировать

    • mik говорит:

      Знаки вопроса это самое плохое что может быть. Тут уже не перекодируешь. Скорей всего для подключения диска был использован модуль ntfs3g, а в этом модуле с недавнего времени нет опций изменения кодировок. Модуль всегда подключает с кодировкой UTF8.
      NTFS диск был создан в какой ОС windows?

  2. mik говорит:

    Как вариант я использую старую версию ntfs-3g, которую можно скачать по ссылке http://ruunix.ru/wp-content/uploads/files/ntfs-3g-1.5130.tgz
    собрать
    ./configure
    make

    потом перейти в каталог ./src там где собирали пакет и оттуда уже вызывать вновь собранную ntgs-3g от суперпользователя root или через sudo. Тут можно играться с опцией locale и смотреть что изменится. Вот для примера так:
    ./ntfs-3g -o locale=ru_RU.KOI8-R /dev/sdc1 /mnt/tmp

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *