@rollthebones

Как сделать так, чтобы баш скрипт работал с папками, содержащими пробелы?

Задача: Рекурсивной обойти директорию и если файл находится в кодировке 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
  • Вопрос задан
  • 179 просмотров
Пригласить эксперта
Ответы на вопрос 1
hint000
@hint000
у админа три руки
В общем случае пробелы экранируют кавычками. В вашем коде и так почти везде переменные взяты в кавычки, но есть участок, где это не так; попробуйте взять в кавычки $1 и $i вот здесь:
for i in `find $1 -type f`
do
    # Получаем кодировку очередного файла
    cod=`enca -L ru $i`

Заниматься реальным тестированием скрипта мне сейчас лень, просто надеюсь, что догадка сработает.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы