我想运行pandoc
命令(从一个或多个pdf
创建.md
个文件作为输入参数传递。
但是,.md
文件列表不是先验的。
我想要像
一样运行pandoc -s -o out.pdf file1.md ... fileN.md
我可以通过md
检索find
个文件,即
find . -name '*.md'
然后运行一个exec,即
find . -name '*.md' -exec bash -c 'pandoc -s -o out.pdf $0 -' {} \;
但是这会迭代地调用pandoc
而不是一次性调用所有.md
个文件。
答案 0 :(得分:1)
您可以使用bash
glob选项来执行此操作。设置数组中的所有.md
文件,并一次性将其传递给命令。
shopt -s nullglob globstar
file_list=( **/file*.md )
现在已填充数组,并根据需要将其传递给命令
pandoc -s -o out.pdf "${file_list[@]}"
在将其传递给命令之前,您可以使用printf
查看数组是否包含所需的所有文件
printf '%s' "${file_list[@]}"
nullglob
选项是为了防止扩展在没有与file*.md
glob模式匹配的文件时返回纯字符串。 globstar
选项将对下面任何级别的子目录中的文件进行全局处理。
同样作为一步安全方法,您可以按照以下方式执行此操作,以确保在阵列计数非零时运行命令
(( "${#file_list[@]}" )) && pandoc -s -o out.pdf "${file_list[@]}"
使用unset(-u
)标志一旦不再需要它就可以安全地禁用glob动作。
shopt -u nullglob globstar
答案 1 :(得分:1)
这里没有pandoc,但这样的事情应该有效:
find . -name "*.md" -print0 | xargs -0 pandoc -s -o out.pdf
答案 2 :(得分:0)
while IFS= read -r -d $'\0'; do files+=("$REPLY"); done < <(find . -name "*.md" -print0) && pandoc -s -o out.pdf "${files[@]}"
将文件传递到文件数组并在运行pandoc
后进行while循环