如何将这些命令合并为一个?

如何将这些命令合并为一个?

这就是我想做的:

将 HTML 文件的文件夹转换为 Markdown,同时通过转换为 YAML 来复制每个 HTML 文件的 XML 元数据。

我做了研究并发现了以下命令:

  1. find . -name \*.md -type f -exec pandoc -o {}.txt {} \;

    • 这是在这里找到的,这是一个可以工作并使用 pandoc 的命令,但是文件扩展名是“.html.md”而不是“.md”
  2. find / -name "*.md" -type f -exec sh -c 'markdown "${0}" > "${0%.md}.html"' {} \;

  3. pandoc -f html -t markdown -s input.html -o output.md

    • 这是在这里找到的。这是 pandoc 命令,它显然会复制元数据并将其转换为 YAML,但是它不适用于文件文件夹,只能在打开时使用

我需要的是一个使用 pandoc 的命令,为转换后的文件提供“.md”。扩展名而不是 .html.md,并将 XML 元数据转换为 YAML。所有这些都可以使用这三个命令来实现,只需将它们合并为一个命令即可。

答案1

你需要的是 xargs。我不熟悉 pandoc,但这样的东西应该可以工作:

$ find . -name \*.html -type f | sed 's/\.html$//' | xargs -I {} pandoc -f html -t markdown -s -o "{}.md" "{}.html"

这使用“查找”列出您选择的目录(以及任何子目录)中的所有 .html 文件。这些内容通过管道传输到 sed,后者会去除“.html”扩展名,然后通过管道传输到 xargs,xargs 将它们一一输入到 pandoc 中; pandoc(如果我正确使用了语法)然后采用每个名称(替换为 {}),使用每个 html 文件作为源并输出到与源文件位于同一目录中的带有 md 扩展名的新文件。

您最终应该在同一目录中得到原始 html 文件和相同数量的匹配 md 文件。

答案2

将 HTML 文件的文件夹转换为 Markdown,同时通过转换为 YAML 来复制每个 HTML 文件的 XML 元数据。

您可以使用它find来驱动该过程。以下是构建命令的方法。

  1. 这会生成一组与 shell (glob) 模式匹配的文件*.html

    find . -type f -name '*.html'
    
  2. 这会将 HTML 文件转换为 Markdown:

    pandoc -f html -t markdown -s input.html -o output.md
    
  3. 我们需要重复该命令,为每个匹配的文件pandoc替换input.html和。output.md我们将使用sh来处理文件名替换:

    find . -type f -name '*.html' -exec sh -c 'pandoc -f html -t markdown -s "$1" -o "${1%html}md"' _ {} \;
    
  4. 由于sh启动匹配文件的每个实例的成本相对较高,因此我们将让它同时处理多个文件:

    find . -type f -name '*.html' -exec sh -c 'for h in "$@"; do m="${h%html}md"; pandoc -f html -t markdown -s "$h" -o "$m"; done' _ {} +
    

您似乎没有提供生成 YAML 的命令,因此我没有将其包含在解决方案中。但是,如果它是与生成的 Markdown 并排的单独文件,那么在 shell 循环中插入命令将非常容易。

答案3

对于许多人来说,使用xargs它来处理find输出看起来并不完全理解。也许借助while read-loop 循环遍历所有文件更容易理解?

寻找 。 -名称“*.html”-类型f |读取行时;做
    pandoc“${行}”\
           -f html \
           -t 降价 \
           -s \
           -o "${line%%.html}.md"
    完毕

引号还用于覆盖包含空格的文件,以防万一。的构造${line%%.html}是“Bashism”,可能无法在其他 shell 中工作。它删除任何.html- 文件名的后缀。

相关内容