пространство, содержащее элементы в цикле for bash

Я хочу рекурсивно преобразовать все файлы уценки под ./src/ в html:

#!/bin/bash

function do_recursive_pandoc {
local markdown_src_file_extension=\*.markdown
local markdown_src_path="$1"
local html_output_path="$2"
mkdir "$html_output_path" 2>/dev/null

for i in $(find $markdown_src_path -name $markdown_src_file_extension 2>/dev/null | cut --delimiter='/' --fields=2- )
do
    mkdir "$html_output_path"/$(dirname "$i") 2>/dev/null
    pandoc -rmarkdown -whtml "$markdown_src_path"/"$i" --output="$html_output_path"/"$i".html
done

}

do_recursive_pandoc "src" "output"

Но если у меня есть место в путях к файлам или именах, bash будет считать их несколькими элементами в цикле for, например, если у меня есть:

./src/dir 1/foo.markdown

этот скрипт создаст каталог ./output/1 вместо ./output/dir 1/ и попытается преобразовать ./src/dir и ./src/1/foo.markdown вместо ./src/dir 1/foo.markdown

Как я могу это исправить?


person Microsoft Linux TM    schedule 05.02.2015    source источник
comment
Используйте больше цитат. Не анализируйте вывод find: используйте его флаг -exec или используйте подстановочные знаки.   -  person gniourf_gniourf    schedule 05.02.2015
comment
возможный дубликат рекурсивного анализа каталога с помощью Pandoc   -  person bonsaiviking    schedule 05.02.2015


Ответы (2)


вам было бы лучше найти трубопроводы в то время как это:

find $markdown_src_path -name $markdown_src_file_extension 2>/dev/null | cut --delimiter='/' --fields=2- | while read i; do
person robert    schedule 05.02.2015
comment
Вы также должны использовать read -r, если в именах файлов есть другие проблемные символы. - person tripleee; 06.02.2015

Это сделает работу:

#!/bin/bash
#############################################################################
function do_recursive_pandoc {
    local src_path=$(realpath "$1") 
    local output_path=$(realpath "$2") && mkdir --parents "$output_path" 2>/dev/null
    find "$src_path" -name "*.markdown" -not -path "$output_path" -exec bash -c '
        i=$1
        o="$3""${1#$2}"
        mkdir --parents "$(dirname "$o")" 2>/dev/null
        if [ -f "$i" ]; then pandoc -rmarkdown -whtml "$i" --output="$o".html ; fi
        ' " " {} $src_path $output_path \;
}
#############################################################################
do_recursive_pandoc "src" "output"
#############################################################################

Я вставил его вместе с базовым CSS в Gist.

person Microsoft Linux TM    schedule 06.02.2015