我有一个充满 HTML 文件的文件夹:
001.htm
002.htm
003.htm
…
我想在它们上运行 Pandoc 以将它们转换为类似名称的 Markdown 文件:
001.md
002.md
003.md
此命令对其中之一起作用:
pandoc -f html -t markdown 001.htm -o 001.md
我想使用find
并xargs
自动对文件夹中的每个文件运行类似的命令。
我了解到的情况如下:
find *.htm | xargs -I {} -n 1 pandoc -f html -t markdown -o {}
…这会截断目录中的每个文件,所以现在我在执行真的打破某物。
我的上述命令有什么问题?或者有什么完全不同/更有效的方法来执行此操作?
答案1
我设法用这 1 行代码做到了这一点。如果您对xargs
andfind
部分有灵活性的话。
for f in ./*.htm; do pandoc -f html -t markdown "$f" -o "${f%.htm}.md"; done
如果您想要递归操作(因此:.htm
当前目录中的所有文件以及所有子目录),那么(假设 bash 4+)您可以使用globstar
shell 选项:
shopt -s globstar
for f in ./**/*.htm; do pandoc -f html -t markdown "$f" -o "${f%.htm}.md"; done
答案2
在某些情况下,使用{}
不够灵活。这似乎就是其中之一。
一种可能的解决方法是使用-exec
来自的脚本find
,如下所示:
find . -name '*.htm' -exec ./convert-to-md.sh {} \;
脚本文件应该与此类似,具体取决于确切的pandoc
命令行:
#!/bin/bash
pandoc -f html -t markdown -o "${1/.htm/.md}" "${1}"
如果您不想为此创建并保存脚本文件,您可以随时内联bash
脚本代码:
find . -name '*.htm' | xargs -n 1 bash -c 'pandoc -f html -t markdown -o "${1/.htm/.md}" "${1}"' -
-
最后的附加部分用于$0
填充 bash,通常包括 shell 脚本的名称,以 开头的位置参数$0
。
这使您可以继续使用find
(即使-print0
您xargs -0
正在处理奇怪的文件名),但不需要创建单独的文件。
答案3
{}
你似乎在 pandoc 命令中缺少
find . -name \*.htm | xargs -I {} -n 1 pandoc -f html -t markdown {} -o {}.md
但是然后你就会有文件命名001.htm.md
——你必须决定这是否是一个问题。