
HTML ファイルがいっぱい入ったフォルダーがあります:
001.htm
002.htm
003.htm
…
これらに対して Pandoc を実行して、同様の名前の Markdown ファイルに変換します。
001.md
002.md
003.md
このコマンドはそのうちの 1 つで機能します。
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
xargs
私はこの 1 行でそれを実現できました。 and の部分が柔軟であればfind
。
for f in ./*.htm; do pandoc -f html -t markdown "$f" -o "${f%.htm}.md"; done
再帰的に動作させたい場合(つまり、.htm
現在のディレクトリ内のすべてのファイルとすべてのサブディレクトリ)は、(bash 4 以降を想定)globstar
シェル オプションを使用できます。
shopt -s globstar
for f in ./**/*.htm; do pandoc -f html -t markdown "$f" -o "${f%.htm}.md"; done
答え2
{}
状況によっては、使用方法が柔軟でない場合があります。これはその 1 つのようです。
回避策としては、次のよう-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 に入力するものであり、通常はシェル スクリプトの名前、 で始まる位置引数が含まれます$0
。
find
これにより、(奇妙なファイル名を扱う場合でも)引き続き使用できますが、別のファイルを作成する必要はありませ-print0
ん。xargs -0
答え3
{}
pandocコマンドにが欠けているようです
find . -name \*.htm | xargs -I {} -n 1 pandoc -f html -t markdown {} -o {}.md
しかし、ファイル名が付けられるので001.htm.md
、これが問題であるかどうかを判断する必要があります。