ファイルセットに対してコマンドを繰り返すには?

ファイルセットに対してコマンドを繰り返すには?

次の拡張子を持つファイルでいっぱいのフォルダがあります.dot

a.dot
b.dot
c.dot

このフォルダ内のすべてのファイルを参照して、次のようにコマンドを実行したいと思います。

dot -Tpdf a.dot -o a.pdf
dot -Tpdf b.dot -o b.pdf
dot -Tpdf c.dot -o c.pdf

垂直バーを使用し、次のコマンドを実行する必要があるようです。

ls *.dot | dot -Tpdf ... -o ....pdf

しかし、パイプラインが各ファイルを中間部分にのみ配置する方法はわかりません。使用する必要がありますかxargs?そして延長部分をはずした後、2番目の部分に乗せる方法も出ています。少なくとも正しい方向(使用するシェルコマンド)を教えることができれば、この問題を解決するのに役立ちます。

答え1

使用

for i in *.dat ; do dot -Tpdf "$i" -o "$(basename "$i" dot)pdf" ; done

編集する: スペースを含むファイル名を正しく処理します。

答え2

パラメータファイル名のセットを繰り返す別の方法です。ただし、各反復でファイル名を操作するのに、forループと同じ柔軟性はありません。

ls *.dot | xargs -n1 -I FILE echo dot -Tpdf FILE -o FILE.pdf

結果は次のとおりです。

dot -Tpdf a.dot -o a.dot.pdf
dot -Tpdf b.dot -o b.dot.pdf
dot -Tpdf c.dot -o c.dot.pdf

答え3

あなたがファンなら、次awksedような方法でもこれを達成できます。

ls *.dot | awk '{print("dot -Tpdf "$1" -o "$1)}' | sed 's/.dot/.pdf/2' | sh

関連情報