Задача: Рекурсивной обойти директорию и если файл находится в кодировке cpp866/cp1251/koi8-r, тогда создать копию файла с кодировкой utf-8, добавив .utf после названия.
Сам язык особо не знаю, по кусочкам собрал код, работает как надо, но если папка содержит пробел, тогда скрипт не может нормально отработать.
Кодировку узнаю с помощью enca.
Кодировку меняю с помощью iconv
#!/bin/bash
# если не работает, dos2unix
function encode {
filename_start=$(basename -- "$1")
path=$(dirname $(readlink -f "$1"))
extension=."${1##*.}"
filename="${filename_start%.*}"
# Если изначальное имя такое же, как и после "преобразования", значит файл не имеет расширения и переменную расширения считаем пустой.
if [ "$filename_start" == "$filename" ]; then
extension=""
fi
# Если преобразованный файл уже есть - выходим.
if [ -e "$path"/"$filename".utf"$extension" ] ; then
return
fi
enc=""
if grep -q "$CP866" <<< "$2" ; then
enc="cp866"
elif grep -q "$KOI" <<< "$2" ; then
enc="koi8-r"
elif grep -q "$CP1251" <<< "$2" ; then
enc="cp1251"
fi
iconv -f "$enc" "$i" > "$path"/"$filename".utf"$extension"
echo ""$i" >>>>>>>> "$path"/"$filename".utf"$extension""
}
KOI="KOI8-R"
CP1251="1251"
CP866="866"
for i in `find $1 -type f`
do
# Получаем кодировку очередного файла
cod=`enca -L ru $i`
# С помощью условий проверяем, если одна из нужных - заходим в функцию.
if (grep -q "$CP866" <<< "$cod") || ( grep -q "$KOI" <<< "$cod" ) || ( grep -q "$CP1251" <<< "$cod" ) ; then
encode "$i" "$cod"
fi
done