Автор Гілка: Перекодування текстових файлів  (Прочитано 3855 раз)

Відсутній Sandr

  • Графоман
  • ****
  • дописів: 461
  • Карма: +0/-0
  • Мій вибір — Лінукс!
    • ФОП Осипенко
Доброго дня шановні форумчани!

Зіткнувся з наступною проблемою. Потрібно перезберегти велику кількість текстових файлів з іншим кодуванням. Тобто є файли, збережені в кодуванні Кирилиця (cp 1251), які потрібно перезберегти в кодуванні Юнікод (utf8).

Один файл перезберегти можна за допомогою звичайного текстового редактора KWrite, чи іншого. А от чи існує програма для одночасного перезбереження багатьох файлів у іншому кодуванні?
openSUSE + KDE

Михайло Даниленко

  • Гість
Re: Перекодування текстових файлів
« Відповідей #1 : 2008-07-10 14:18:50 »
варіант із заміною попереднього файлу
$ for file in some\ dir/* some\ other\ dir/*; do \
> iconv -c -f windows-1251 -t utf-8 "$file" -o "$file.utf" ; \
> mv -f "$file.utf" "$file" ; \
> done


варіант із збереженням у теці new (із збереженням структури директорій)
$ for file in some\ dir/* some\ other\ dir/*; do \
> mkdir -p "new/${file%/*}" ; \
> iconv -c -f windows-1251 -t utf-8 "$file" -o "new/$file" ; \
> done

Відсутній DalekiyObriy

  • Літератор
  • ******
  • дописів: 1929
  • Карма: +5/-0
Re: Перекодування текстових файлів
« Відповідей #2 : 2008-07-10 16:04:12 »
варіант із заміною попереднього файлу
$ for file in some\ dir/* some\ other\ dir/*; do \
> iconv -c -f windows-1251 -t utf-8 "$file" -o "$file.utf" ; \
> mv -f "$file.utf" "$file" ; \
> done

обов’язково && замість ; !!!
Fedora 35 (x86-64)

Михайло Даниленко

  • Гість
Re: Перекодування текстових файлів
« Відповідей #3 : 2008-07-10 16:10:37 »
ну, дійсно, але один біс я б використовував другий варіант...

Відсутній Sandr

  • Графоман
  • ****
  • дописів: 461
  • Карма: +0/-0
  • Мій вибір — Лінукс!
    • ФОП Осипенко
Re: Перекодування текстових файлів
« Відповідей #4 : 2008-07-10 18:25:53 »
В мене таке питання виникло...  :-/

Це наведено перелік команд для терміналу, чи так має виглядати вміст виконавчого файлу?

Мене збивають з пантелику оті зворотні слеші в кінці кожного рядка. І ще не зрозуміло, чому на початку рядків спочатку йде "$", а потім ">"...

І де там вказується шлях до розташування файлів, які потрібно перезберегти?
openSUSE + KDE

Михайло Даниленко

  • Гість
Re: Перекодування текстових файлів
« Відповідей #5 : 2008-07-10 19:14:07 »
Оскільки це скоріше за все одноразова задача - я навів його у вигляді, як ніби воно набирається у командному рядку, $ та > - це відповідно запрошення. файли вказуються після in - наразі це усі файли у теках "some dir" та "some other dir".

Відсутній Sandr

  • Графоман
  • ****
  • дописів: 461
  • Карма: +0/-0
  • Мій вибір — Лінукс!
    • ФОП Осипенко
Re: Перекодування текстових файлів
« Відповідей #6 : 2008-07-10 19:53:23 »
Якщо файли, призначені для перезберігання, знаходяться приміром в теці /home/user/public_html , то я повинен написати в терміналі наступний набір команд:
> for file in /home/user/public_html/*&& iconv -c -f windows-1251 -t utf-8 "$file" -o "$file.utf" && mv -f "$file.utf" "$file"
Правильно це буде?
openSUSE + KDE

Praporshic

  • Гість
Re: Перекодування текстових файлів
« Відповідей #7 : 2008-07-10 19:58:25 »
> for file in /home/user/public_html/*&& iconv -c -f windows-1251 -t utf-8 "$file" -o "$file.utf" && mv -f "$file.utf" "$file"
Правильно це буде?

Ні, не правильно. Правильно буде так:
Цитата
for file in /home/user/public_html/* do; iconv -c -f windows-1251 -t utf-8 "$file" -o "$file.utf"; mv -f "$file.utf" "$file"; done

Михайло Даниленко

  • Гість
Re: Перекодування текстових файлів
« Відповідей #8 : 2008-07-10 20:01:42 »
по-перше, зробіть бекап тих файлів - щось може піти не так.
по-друге,
$ for file in /home/user/public_html/* ; do if [ -f "$file" ] ; then iconv -c -f windows-1251 -t utf-8 "$file" -o "$file.utf" && move -f "$file.utf" "$file" || echo "ERROR: $file" ; fi ; done
по-третє, це обробить лише файли, які знаходяться прямо у цій директорії, якщо треба вкладені - треба буде робити через find.

Михайло Даниленко

  • Гість
Re: Перекодування текстових файлів
« Відповідей #9 : 2008-07-10 20:05:50 »
Тьху!!! ó_O
Не move, а mv. тобто
$ for file in /home/user/public_html/* ; do if [ -f "$file" ] ; then iconv -c -f windows-1251 -t utf-8 "$file" -o "$file.utf" && mv -f "$file.utf" "$file" || echo "ERROR: $file" ; fi ; done

Відсутній Sandr

  • Графоман
  • ****
  • дописів: 461
  • Карма: +0/-0
  • Мій вибір — Лінукс!
    • ФОП Осипенко
Re: Перекодування текстових файлів
« Відповідей #10 : 2008-07-11 13:03:02 »
Щось не працює цей набір команд...  :(

А можна зробити з цього набору команд виконавчий файл, який би можна було поміщати в теку з файлами, що потрібно перезберегти, і запускати його там для обробки файлів тієї теки?

P.S. І якщо можна, то підкажіть будь ласка, як це зробити.
« Змінено: 2008-07-11 13:05:04 від Sandr »
openSUSE + KDE

Михайло Даниленко

  • Гість
Re: Перекодування текстових файлів
« Відповідей #11 : 2008-07-11 13:16:52 »
Як саме не працює - що пише?

Засуньте вищенаведене усередину текстового файлу, додайте перший рядок вигляду
#! /bin/bash
та змініть те що після in на "$PWD"/*
потім встановіть права на виконання цього файлу.

Відсутній Sandr

  • Графоман
  • ****
  • дописів: 461
  • Карма: +0/-0
  • Мій вибір — Лінукс!
    • ФОП Осипенко
Re: Перекодування текстових файлів
« Відповідей #12 : 2008-07-11 15:04:35 »
Дякую, вже все запрацювало!  8-)

Сформував я виконавчий скрипт у файлі toutf.

Потім установив йому право на виконання й записав його в теку /bin. Далі задав йому групу users, щоб надати можливість простому користувачеві виконувати цей скрипт. В підсумку в мене вийшов файл з наступними параметрами:

-rwxr-xr-x 1 root users 300 2008-07-11 14:23 toutf
Таким чином тепер можна просто заходити в теку з файлами, які потрібно перезберегти в Юнікод, та набрати команду toutf.
« Змінено: 2008-07-11 15:39:03 від Sandr »
openSUSE + KDE

Відсутній BM

  • Кореспондент
  • ***
  • дописів: 162
  • Карма: +0/-0
  • SUSE Linux Products GmbH
Re: Перекодування текстових файлів
« Відповідей #13 : 2008-08-07 09:08:40 »
Потім установив йому право на виконання й записав його в теку /bin.
Ouch!.. :o Зазвичай таке пхається в /usr/local/bin ...