Не совсем Битрикс, но для него. Пакетная перекодировка файлов
19.07.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
ЗЫ Скрипт переписывает существующие файлы, так что делайте бекапы перед использованием, особенно если не понимаете, что делаете.
Просмотров:
4065