2017-02-18 3 views
1

Я хотел бы преобразовать все свои работы в книгу LaTeX из ISO8859-1 в UTF-8.Bash скрипт для преобразования кодировки

Я нашел сценарий, который я бы хотел адаптировать. Так вот что я писал:

# start encoding 
encodeFrom='ISO-8859-1' 
# target encoding 
encodeTo='UTF-8' 
# finding files whose extensions correspond to the given parameter 
for filename in ` find . -type f -name *.{$1}` 
do  
    echo $filename 
    # saving source file 
    mv $filename $filename.save 
    # convert file 
    iconv -f $encodeFrom -t $encodeTo $filename.save -o $filename 
    # check that file is in unix mode 
    dos2unix $filename 
done 

Проблема заключается в следующем: «найти» команда не работает: тестирование его с «установить -v», я получаю:

find . -type f -name *.{$1} 

Что я сделал не так ? Я попытался найти способ бросить книгу bash (по сути, два :-), но не смог найти решение.

Даже пытается просто текс преобразования файлов:

for filename in ` find . -type f -name *.tex` 

я получаю:

find: les chemins doivent précéder l'expression : arithmetique.tex 
+0

Если у вас есть ответ, который решает ваш вопрос - нажмите «принять ответ», но не обновляйте заголовок или текст с помощью '[resolved]' – Soren

ответ

0

ОК, я нашел ответ: просто "защитить" аргумент, как это '$ 1.': ". $ 1".

Все, что я должен был сделать спросить :-)

\ прощай

+0

. Вы видите, помог ли мой ответ? – Inian

+0

ОК. Извините, что забыли правильно принять ваш ответ :-( –

+0

В то время как двойные кавычки нужны около $ 1, этого недостаточно для решения проблем в скрипте – Soren

2

ParsingLs Смотрите, почему вы должны НЕ синтаксического анализа выход find или ls в цикле.

Используйте правильный синтаксис, процесс замещения с While-петлей и ВСЕГДА двойных кавычек вашего переменными.

while IFS= read -r filename 
do 
    echo "$filename" 
    mv "$filename" "${filename}".save 
    iconv -f "$encodeFrom" -t "$encodeTo" "${filename}".save -o "$filename" 
    dos2unix "$filename" 
done < <(find . -type f -name "*.{$1}") 

Как видно ниже, рекомендуется использовать -print0 опцию в find в случае, если ваши имена файлов имеют символ новой строки, пробелы или другие специальные символы,

-print0 
     True; print the full file name on the standard output, followed by a null character 
     (instead of the newline character that -print uses). This allows file names 
     that contain newlines or other types of white space to be correctly interpreted by 
     programs that process the find output. 

С его помощью в find

while IFS= read -r -d'' filename 
do 
    echo "$filename" 
    mv "$filename" "${filename}".save 
    iconv -f "$encodeFrom" -t "$encodeTo" "${filename}".save -o "$filename" 
    dos2unix "$filename" 
done < <(find . -type f -name "*.{$1}" -print0) 

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

+0

Спасибо за просвещение, @inian :-) –

+0

@NicolasFRANCOIS: См. [Что должно Я делаю, когда кто-то отвечает на мой вопрос] (http://stackoverflow.com/help/someone-answers)? – Inian

+0

Это связано с той же проблемой, что разбор 'ls' делает: имена файлов с новыми символами в них. – chepner

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