MyTetra Share
Делитесь знаниями!
Скрипт, который автоматически определяет кодировку файла и открывает редактор с перекодированным файлом
Время создания: 27.04.2019 09:25
Текстовые метки: linux, кодировка, UTF-8, iconv, конвертировано, автоматическое определение, редактор, micro
Раздел: Компьютер - Linux - Bash - Кодировки и локализация
Запись: xintrea/mytetra_syncro/master/base/1556346322qtxqip9q45/text.html на raw.github.com

Скрипт открывает консольный редактор micro, предварительно перекодировав файл в кодировку UTF-8. После редактирования файл сохраняется в своей первоначальной кодировке. Для работы скрипта нужно, чтобы существовал каталог /tmp/codePageAutoDetect.


Скрипт использует следующие программы: iconv и uchardet. Они должны быть установлены.

Файл скрипта: /opt/script/microAuto.sh


Соответственно, на редактирование файл открывается командой:



/opt/script/microAuto.sh имяФайла



Скрипт:



#!/bin/bash


# В первом параметре $1 должно быть имя файла


# Если первый параметр пустой (все пробелы в проверяемой строке удаляются)

if [ -z "${1// /}" ]

then

echo "No filename in parameter"


# Просто запускается редактор micro

micro

exit

fi


# Если файл не сущесвует

if test ! -f "$1";

then

echo "File not found";

exit

fi


# Автоопределение кодировки файла

cp=`uchardet "$1"`

# echo $cp


# Если кодировка не определена или кодировка соответствует системной,

# процедуру подмены перекодированного файла запускать не имеет смысла

if [[ "$cp" == "ascii/unknown" || "$cp" == "UTF-8" ]]

then

micro "$1"

exit 0

fi


workDirName="/tmp/codePageAutoDetect"

subDirName=`cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1`

fileDirName=$workDirName/$subDirName

shortFileName=`basename "$1"`

fullFileName=$fileDirName/$shortFileName

filePermission=`stat -c "%a" "$1"`


# Создается временный каталог

mkdir -p $fileDirName


# Во временный каталог копируется редактируемый файл со своим именем

cp "$1" "$fullFileName"


# Файл во временном каталоге переконвертируется из своей кодировки в UTF-8

iconv -f $cp -t UTF-8 "$fullFileName" -o tmpfile && mv tmpfile "$fullFileName"


# Запоминается время последнего изменения, чтобы после срабатывания редактора определять, было ли редактирование

modifyTimeBefore=`LC_ALL=C stat "$fullFileName" | grep "^Modify:"`

# echo $modifyTimeBefore


# Открывается редактор

micro "$fullFileName"


modifyTimeAfter=`LC_ALL=C stat "$fullFileName" | grep "^Modify:"`

# echo $modifyTimeAfter


# Если время до редактирования и после редактирования отличаются

if test ! "$modifyTimeBefore" = "$modifyTimeAfter";

then

# echo "Is modify"


# Файл во временном каталоге переконвертируется из UTF-8 в свою кодировку

iconv -f UTF-8 -t $cp "$fullFileName" -o tmpfile && mv tmpfile "$fullFileName"


# Отредактированный файл переносится поверх исходного

mv -f "$fullFileName" "$1"


# Отредактированному файлу выставляются прежние права

chmod $filePermission "$1"

else

# echo "Is not modify"

rm -f "$fullFileName"

fi


# Удаляется временный каталог

rmdir $fileDirName



 
MyTetra Share v.0.59
Яндекс индекс цитирования