Добавить конвертацию в баш

Тема в разделе "Администрирование серверов", создана пользователем Doctor_Chaos, 7 авг 2015.

Модераторы: mefish, stooper
  1. Doctor_Chaos

    Doctor_Chaos Проктолог-гинеколог

    Moderator
    • Супермодератор
    Регистр.:
    7 сен 2013
    Сообщения:
    950
    Симпатии:
    645
    Ищу файлы в UTF-8 следующим скриптом:
    #!/bin/bash
    find . -name "*.js" -print0 | while read -d $'\0' -r path; do test "$(echo "$path" | enca -L russian -i)" = "UTF-8" || echo "$path" >> 1.txt; done
    В итоге идет вывод всех файлов в утф в файл 1.txt
    Как допилить скрипт, чтобы вместо записи в файл автоматом перекодировало в 1251?
    То есть нужно добавить в обработчик
    iconv -f UTF-8 -t WINDOWS-1251 "$i" > tmp.file; mv tmp.file "$i";
    Как это сделать правильно?
     
  2. Doctor_Chaos

    Doctor_Chaos Проктолог-гинеколог

    Moderator
    • Супермодератор
    Регистр.:
    7 сен 2013
    Сообщения:
    950
    Симпатии:
    645
    Все, решил сам вопрос:
    Скрипт для поиска и перекодирования файлов из одной кодировки в другую только файлов исходной кодировки:
    #!/bin/bash
    find -name "*.js" -type f -print0 | while read -d $'\0' -r path; do test "$(echo "$path" | enca -L russian -i)" = "UTF-8" || iconv -f UTF-8 -t WINDOWS-1251 "$path" > tmp.file; mv tmp.file "$path"; done
    Может пригодится кому
     
    mrLom нравится это.
  3. mrLom

    mrLom ♒︎

    Moderator
    Регистр.:
    24 дек 2014
    Сообщения:
    822
    Симпатии:
    1.399
    А вот пример в одну строку, как можно перекодировать в UTF-8. Расширение искомых файлов можно добавлять.
    Для конвертации используется утилита enconv из пакета enca, приимущество перед iconv в том, что не нужно создавать временные файлы, конвертирует сразу в нужную кодировку. man enconv
    Код:
    find . -type f \( -name "*.php" -o -name "*.snp" -o -name "*.js" -o -name "*.css" -o -name "*.less" -o -name "*.xml" -o -name "*.config" -o -name "*.csv" \) -exec enconv -L ru -x UTF-8 '{}' ';'
    
    и наоборот, в 1251
    Код:
    find . -type f -name '*.php' -exec enconv -V --convert-to=CP1251 '{}' ';'
    
    Расширить поиск по файлам, можно из предыдущего примера.
     
    Последнее редактирование: 7 авг 2015
    Doctor_Chaos нравится это.
  4. Doctor_Chaos

    Doctor_Chaos Проктолог-гинеколог

    Moderator
    • Супермодератор
    Регистр.:
    7 сен 2013
    Сообщения:
    950
    Симпатии:
    645
    Дело в том, что в этом варианте будет энкодить все подряд, а у меня ситуация дурацкая - среди тонны файлов в 1251 есть некоторое количество в UTF. Нужно перекодировать только их.
     
  5. mrLom

    mrLom ♒︎

    Moderator
    Регистр.:
    24 дек 2014
    Сообщения:
    822
    Симпатии:
    1.399
    В моем примере, помоему (если не отшибает мозги), если оно уже в нужной кодировке, должно пропустить конвертацию. enca шибко умная
     
    Doctor_Chaos нравится это.
  6. Doctor_Chaos

    Doctor_Chaos Проктолог-гинеколог

    Moderator
    • Супермодератор
    Регистр.:
    7 сен 2013
    Сообщения:
    950
    Симпатии:
    645
    Точно, так и есть - перекодировало как надо, спасибо!
    Единственное - требует обязательно наличие ключа -L ru
     
  7. mrLom

    mrLom ♒︎

    Moderator
    Регистр.:
    24 дек 2014
    Сообщения:
    822
    Симпатии:
    1.399
    Да, верно, это я уже по пьяной памяти писал, пропустил =))
     
  8. andrei_k

    andrei_k

    Регистр.:
    17 янв 2010
    Сообщения:
    251
    Симпатии:
    52
    Вот хороший мануал под винду:
     
    Последнее редактирование: 18 сен 2015
  9. Proxyr

    Proxyr Постоялец

    Регистр.:
    18 авг 2011
    Сообщения:
    111
    Симпатии:
    101
    Оказывается не каждый провайдер устанавливает на хостинг пакет "enca" и смена кодировки "enconv" не работает.
    Пришлось тащить все файлы к себе и конвертировать на месте из под Windows.
     
  10. mrLom

    mrLom ♒︎

    Moderator
    Регистр.:
    24 дек 2014
    Сообщения:
    822
    Симпатии:
    1.399
    1. Все же это тема конвертации в баш.
    2. По опыту — в любом провайдере, с адекватной ТП, можно попросить установить на VPS пакет enca, главное объяснить, что вам понадобится пакетная конвертация, в этом пакете нет ничего крамольного, ресурсы не жрет, т.к. это не "болтающийся" резидент. Главное пошевелить поддержку. Впрочем, в наше время можно и не за дорого VDS купить. Не таскать же туда-сюда файлы ради конвертации!