Сен
10
2010

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

Перекодировка файлов в Ubuntu Я немного остыл после недавнего облому с хостером. Повезло восстановить большинство проиндексированных новостей сайтов с помощью кеша гугла и яндекса. Правда не удалось восстановить единственный утраченный пост с этого блога о кодировке. Немного поразмыслив, решил наново его написать. Может он мне еще пригодится.

Итак этот пост создан для того, чтобы убрать множество вопросов связанных с Убунту и ее «любовью» к кодировке вин1251 🙂

Начнём с кодировок в названиях файлов.

Чтоб их перекодировать в правильную кодировку выполняем следующую команду в терминале:

convmv -r -f cp1251 -t utf-8 --notest

Без параметра —notest процесс пройдёт в тестовом режиме. С этим параметром все изменения будут записаны. Сам convmv должен быть предварительно установлен.

sudo apt-get install convmv

Иногда нужно избавиться от названий файлов с кириллицей. Создаём файл:

#!/bin/bash
# Перекодирует рекурсивно в текущем каталоге имена
# файлов и каталогов в транслит.
shopt -s nullglob
for NAME in *.mp3 ; do
  TRS=`echo $NAME | sed "y/абвгдезийклмнопрстуфхцы/abvgdezijklmnoprstufxcy/"`
  TRS=`echo $TRS  | sed "y/АБВГДЕЗИЙКЛМНОПРСТУФХЦЫ/ABVGDEZIJKLMNOPRSTUFXCY/"`
  TRS=${TRS//ч/ch};
  TRS=${TRS//Ч/CH} TRS=${TRS//ш/sh};
  TRS=${TRS//Ш/SH} TRS=${TRS//ё/jo};
  TRS=${TRS//Ё/JO} TRS=${TRS//ж/zh};
  TRS=${TRS//Ж/ZH} TRS=${TRS//щ/sh\'};
  TRS=${TRS//Щ/SH\'} TRS=${TRS//э/je};
  TRS=${TRS//Э/JE} TRS=${TRS//ю/ju};
  TRS=${TRS//Ю/JU} TRS=${TRS//я/ja};
  TRS=${TRS//Я/JA} TRS=${TRS//ъ/\`};
  TRS=${TRS//ъ\`} 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

и выполняем его.

Есть огромная куча текстовых файлов в кодировке cp1251. А нам нужно это конвертировать в UTF-8. Мне понравился такой подход:

find . | while read i; do iconv -f  WINDOWS-1251 -t UTF-8 "$i" >tmp; mv tmp "$i"; done

Будут конвертированы все файлы во всех вложенных папках. Бинарные файлы (например, картинки) тоже будут «конвертированы» (повреждены). Поэтому нужно из поиска их исключить. Как? После «find . | » дописать что-то вроде:

grep -v png | grep -v jpg | grep -v gif | 

То есть всю команда будет такой:

find . | grep -v png | grep -v jpg | grep -v gif | while read i; do iconv -f  WINDOWS-1251 -t UTF-8 "$i" >tmp; mv tmp "$i"; done

Если конвертировать в юникод нужно только php-файлы:

find . -name '*.php' | while read i; do iconv -f  WINDOWS-1251 -t UTF-8 "$i" \
 >tmp; mv tmp "$i"; done

Старый сайт был создан очень давно в кодировке вин1251. Нужно найти упоминание — windows-1251. Вот так:

grep -ir windows-1251 .

Точка в конце — искать команда будет с текущей директории. Опции же -ir — выводит на экран все значения не зависимо от регистра. Поиск будет рекурсивным (во всех вложенных директориях).

Увидели результат. произведем замену например в файлах *.php. Вот так:

find . -name "*.php" -exec sh -c 'sed "s/windows-1251/UTF-8/g" "{}" \
           > tmpfile && mv tmpfile "{}"' \;

Перепроверяем:

grep -ir windows-1251 .

Больше ничего не должно вывестись на экран. Только, если не будут найдены совпадения в других файлах, которые не *.php. Тогда придётся повторить операцию и с ними.

Обилием иероглифов нам режут глаза теги в mp3-файлах. До сих пор некоторые умельцы сохраняют их в cp1251. Такие ошибки легко исправить! Устанавливаем пакет python-mutagen и приступаем к преобразованию:

find -iname '*.mp3' -print0 | xargs -0 mid3iconv -eCP1251 --remove-v1

Вариант не использующий xargs:

find . -iname “*.mp3″ -exec mid3iconv -e CP1251 -d –remove-v1 {} ;

Для работы с тегами есть хорошая программа EasyTag. Как с ней работать, разобраться несложно 😉 Удачи!



Метки: , ,


  • Tol9222

    автор такой конченый идиот.
    зачем писать: find . | while read i; do iconv -f  WINDOWS-1251 -t UTF-8 «$i» >tmp; mv tmp «$i»; done

    многие люди не читают текст, ка кправило, читаю предложение сверху над кодом, что оно делает, и пользуют код.

    далбоеб

  • Многие люди как раз читают текст и только школота, которой все должны по своей тупости переходит на личности в комментариях!!!

Читайте, не отвлекайтесь! =)

© Интернет дом ленивца - личный блог о сео, смо, сайтостроению. Построен на небольших заметках автора. Копирование материалов без активной ссылки на darmoid.ru запрещается и преследуется законом об авторском праве!
Вверх!