使用 find、xargs 等输出类似名称的文件

使用 find、xargs 等输出类似名称的文件

我有一个充满 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

我想使用findxargs自动对文件夹中的每个文件运行类似的命令。

我了解到的情况如下:

find *.htm | xargs -I {} -n 1 pandoc -f html -t markdown -o {}

…这会截断目录中的每个文件,所以现在我在执行真的打破某物。

我的上述命令有什么问题?或者有什么完全不同/更有效的方法来执行此操作?

答案1

我设法用这 1 行代码做到了这一点。如果您对xargsandfind部分有灵活性的话。

for f in ./*.htm; do pandoc -f html -t markdown "$f" -o "${f%.htm}.md"; done

如果您想要递归操作(因此:.htm当前目录中的所有文件以及所有子目录),那么(假设 bash 4+)您可以使用globstarshell 选项:

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(即使-print0xargs -0正在处理奇怪的文件名),但不需要创建单独的文件。

答案3

{}你似乎在 pandoc 命令中缺少

find . -name \*.htm | xargs -I {} -n 1 pandoc -f html -t markdown {} -o {}.md

但是然后你就会有文件命名001.htm.md——你必须决定这是否是一个问题。

相关内容