find、xargsなどを使用して、同様の名前のファイルを出力する

find、xargsなどを使用して、同様の名前のファイルを出力する

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}"' -

-末尾の追加の部分は$0bash に入力するものであり、通常はシェル スクリプトの名前、 で始まる位置引数が含まれます$0

findこれにより、(奇妙なファイル名を扱う場合でも)引き続き使用できますが、別のファイルを作成する必要はありませ-print0ん。xargs -0

答え3

{}pandocコマンドにが欠けているようです

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

しかし、ファイル名が付けられるので001.htm.md、これが問題であるかどうかを判断する必要があります。

関連情報