
我有一個充滿 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
和部分靈活的話find
。
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 指令中缺少 a
find . -name \*.htm | xargs -I {} -n 1 pandoc -f html -t markdown {} -o {}.md
但隨後您將獲得一份名為001.htm.md
— 的文件,您必須確定這是否是一個問題。