2015-01-03 2 views
1

Я пишу очень простой скрипт bash для изменения кодировки файлов .html и рекурсивно обрабатывать каталоги. Функция работает правильно только для каталога первого уровня. Можете ли вы сказать мне, где я ошибаюсь? Вот код.Простая ошибка рекурсии bash

#!/bin/bash 

handleFiles() { 
local REGEXP='.+\.html$' 
echo $1 
for f in $1/* 
    do 
    if [[ -d $f ]] 
     then 
     handleFiles "$f" 
    elif [[ $f =~ $REGEXP ]] 
     then 
     echo "Converting $f" 
     enconv -L bg -x UTF-8 "$f" 
    fi 
done 
} 

# The script show all .html files in test 
# enter into subdirectory but not working .. 
handleFiles "test" 

Вот структура каталога тест:

test$ tree 
. 
├── test.html 
└── Untitled Folder 
    └── test1.html 

1 directory, 2 files 

Когда я запускаю скрипт я получаю следующий вывод:

./converter.sh 
test 
Converting test/test.html 
test/Untitled Folder 

Чтобы вся история, которую я после моего окончательного решения. Надеюсь, это будет полезно для кого-то с аналогичной проблемой.

#!/bin/bash 

######################################################## 
# This bash script assume directory as a argument 
# and convert all .html,js and xml files from 
# windows-1251 encoding into utf-8 encoding. 
# @author Georgi Naumov 
# @email [email protected] for contacts and 
# suggestions. 
######################################################## 

if [[ $# -ne 1 ]] ; then 
    echo "Usage $0 <<directory to change encoding reqursively>>" 
    exit 1 
fi 

handleFiles() { 
local REGEXP='.+\.(html|js|xml)$' 
for f in "$1"/* 
    do 
    if [[ -d "$f" ]] 
     then 
     handleFiles "$f" 
    elif [[ "$f" =~ $REGEXP ]] 
     then 
     echo "Converting $f" 
     enconv -L bg -x UTF-8 "$f" 
    fi 
done 
} 

handleFiles "$1" 
+1

Это упражнение или вы заинтересованы в более простой способ преобразования файлов? –

+0

Я просто пишу это, чтобы преобразовать много файлов в один каталог, но хочу улучшить решение для обработки вложенных каталогов рекурсивными. –

+1

Цитировать '$ f' с' '' 'для обработки каталогов с пробелами (например, Untitled Folder). – Cyrus

ответ

2

Цитата также $1 обрабатывать пробельные (например Untitled Folder):

for f in "$1"/* 
+0

Спасибо. Я просто хочу знать, почему мое решение не работает должным образом. –

4

Весь подход более сложный, чем необходимо. Я рекомендую использовать find:

find test -name '*.html' -exec enconv -L bg -x UTF-8 '{}' \; 

Если вы хотите сделать это вручную, вы должны поставить $f в двойные кавычки везде (то есть, "$f"), или он сломается, если каталог содержит пробелы, как вы заметили, потому что оболочка будет расширять его на два (или более, в зависимости от случая) отдельных токенов.

+0

Таким образом, решение лучше, но я хочу знать, почему мое решение не работает +1. –

+1

Поместите '$ 1' в кавычки также, то есть' for i в $ 1 "/ *', так как '$ 1' также будет содержать пробелы. – Wintermute

+0

Спасибо за ваше время. –

Смежные вопросы