space 包含 bash for 循环中的项目

space containing items in bash for-loop

我想将./src/下的所有markdown文件递归转换为html:

#!/bin/bash

function do_recursive_pandoc {
local markdown_src_file_extension=\*.markdown
local markdown_src_path=""
local html_output_path=""
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"

但是如果我在文件路径或名称中有 space bash 将在 for 循环中将它们计为多个项目,例如如果我有:

./src/dir 1/foo.markdown

此脚本将生成 ./output/1 目录而不是生成 ./output/dir 1/ 并尝试转换 ./src/dir./src/1/foo.markdown 而不是 ./src/dir 1/foo.markdown

我该如何解决?

你最好像这样将 find 管道输送到:

find $markdown_src_path -name $markdown_src_file_extension 2>/dev/null | cut --delimiter='/' --fields=2- | while read i; do

这将完成工作:

#!/bin/bash
#############################################################################
function do_recursive_pandoc {
    local src_path=$(realpath "") 
    local output_path=$(realpath "") && mkdir --parents "$output_path" 2>/dev/null
    find "$src_path" -name "*.markdown" -not -path "$output_path" -exec bash -c '
        i=
        o="""${1#}"
        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