понедельник, 6 июня 2016 г.

Не совсем Битрикс, но для него. Пакетная перекодировка файлов.

В очередной раз сокрушаясь, что модули надо писать в CP1251 (прошлый век, ну честное слово), а разрабатывать всё-таки удобнее в UTF-8, сделала я попытку найти перекодировщик, чтобы тыкнул и - бац - перекодировалось.
Ну ленивая я, чесслово, да и путать стала, где у меня CP1251, а где UTF-8.

Сегодня пакетно перекодируем файлы из UTF-8 в CP1251, но не все, а только те, которые надо. Разжёвано - дальше некуда, но я же не заставляю читать =)

Да, к слову, у нас уже давно весь офис посажен бесповоротно на убунту, так что я даже забыла как виндой пользоваться, и на домашний ноутбук тоже убунту поставила.
Из лени встроенной поискала что-нибудь с интерфейсом, потом поняла, что легче разобраться в баше и написать свои пару строчек.
Кажется, я всё-таки скоро отращу бороду и свитер.

Итак, для сборки обновлений у меня есть отдельная папочка, куда я сваливаю файлики. Обновления модуля, если кто не знает, выкатываются в CP1251 в tar.gz архиве папки с номером версии обновления, например 0.8.1.tar.gz (можно и в zip, кстати).

Скрипт

Саму папку с обновлением мы и будем скармливать скрипту. Вот его полный текст
#!/usr/bin/env bash

find "$1" -name '*.php' | while read i
do
 echo '------------------------------------------'
 echo $i
 ENCAREZ="$(enca -e $i)"
 echo $ENCAREZ

 if [[ $ENCAREZ == UTF-8 ]]
 then
  iconv -f UTF-8 -t CP1251 "$i" > tmp
  mv tmp "$i"
  echo '!! encoded !!'
 fi
 
done

Для тех, кто ваще не понял чего произошло, почти построчно разберём скриптик.

Первая строка говорит командной строке кто будет выполнять дальнейшие инструкции. Это не комментарий, это такая инструкция =)

Команда find "$1" -name '*.php' ищет в указанной папке файлы с именем (настройка -name), заканчивающимся на .php
Папка указывается при запуске скрипта в командной строке, об этом чуть ниже, в разделе Запуск скрипта. Скрипт принимает аргументы из командной строки и раскладывает аргументы поочерёдно в переменные с именами $1, $2 и т.д. Кстати, в переменной $0 лежит имя самого скрипта, это так всегда.
Итак, при запуске вы задали скрипту папку, где осуществлять поиск; он положил имя папки в переменную $1, которую мы и использовали, передав эту информацию команде find.

Команда "палочка" - это перенаправление результатов работы одной команды на вход другой команде, так называемый pipe, трубопровод =)) То есть результат работы команды find мы передаём на обработку команде while.

Конструкция
while read i
do
done
позволяет нам построчно читать поступающую от find информацию. while read i читает строку и кладёт её в переменную i, do - это обозначение начала цикла, а done - обозначение конца цикла.

Команда echo просто выводит строку, это чтобы было чётко видно что и где у нас обработалось или не обработалось

Строка ENCAREZ="$(enca -e $i)" это присвоение значения переменной. Тут мы кладём в переменную ENCAREZ результат работы команды enca -e $i, где $i - это строка, прочитанная командой while из результатов работы команды find.

enca -e $i возвращает кодировку файла, мне она показалась самой удобной в использовании, если она у вас не стоит - смотрите далее по статье в раздел Установка enca

Конструкция
if [[ $ENCAREZ == UTF-8 ]]
then
fi
как наверное видно из синтаксиса - это условный оператор, в случае выполнения условия в  скобочках выполняющий указанные после then операции. fi - это конец конструкции (собственно, это if наоборот). То есть, нормальным языком это можно прочитать как "если кодировка файла равна UTF-8, то делать то-то и то-то". В нашем случае - делать перекодировку указанного файла из UTF-8 в CP1251.

Что и осуществляется командой iconv -f UTF-8 -t CP1251 "$i" > tmp
iconv - очень развитая команда по перекодировке файлов, но нам в данном случае надо сделать просто -f (то есть from) UTF-8 перекодировать в -t (to) CP1251
$i, насколько мы уже успели понять, - это переменная, хранящая имя файла

Знак больше > это оператор перенаправления потока; он записывает результат работы команды в файлик tmp в текущей папке, где выполняется скрипт.
Команда mv tmp "$i" перемещает (в данном случае можно сказать замещает) файлик tmp в исходный файл, переписывает его.

Запуск скрипта

Текст скрипта просто кладётся в текстовый файлик и сохраняется с нужным именем. традиционно можно задать ему расширение .sh, у меня файлик называется encodeTo1251.sh

Чтобы файлик стал исполняемым, надо "разрешить" его выполнять командой
chmod +x encodeTo1251.sh

Теперь мы можем использовать его как программку. Например, чтобы перекодировать все файлы в кодировке UTF-8 из папки обновления с названием 0.8.3 в кодировку CP1251, надо запустить скриптик вот так:
./encodeTo1251.sh 0.8.3

Установка enca

sudo apt-get install enca


ЗЫ Скрипт переписывает существующие файлы, так что делайте бекапы перед использованием, особенно если не понимаете, что делаете.



Комментариев нет:

Отправить комментарий