4

見つかったドットファイルごとにsvgファイルを生成するために、ディレクトリでスクリプトを実行したいと思います。何かのようなもの:

find . -name "*.dot" -exec dot -Tsvg \{} \;

これは正常に機能しますが、結果をstdoutに出力するだけです。通常、私はリダイレクトを使用してsvgファイルを生成しています。ドットファイル名を取得して、次のようなリダイレクトで使用するにはどうすればよいですか?

find . -name "*.dot" -exec dot -Tsvg > "$dotfilename".svg \{} \;
4

4 に答える 4

5

以下:

for i in `find . -name "*.dot"`; do
   dot -Tsvg $i > $i.svg
done

検索を(バッククォートで)実行し、結果をループして、dotそれぞれに対して実行します。ファイル名はにあり$iます。

これはバックティック置換を使用し、後で別のコマンドで使用するためにコマンド出力をキャプチャするための便利なメカニズムです。

拡張機能を削除して別の拡張機能を追加するには、を使用します${i%.*}.svg。詳細については、このSOの回答を参照してください。

于 2012-07-12T14:30:16.640 に答える
5

出力リダイレクトは必要ありません。-Oを使用して、入力ファイル名と出力形式から名前が自動的に作成されるファイルに保存します。

find . -name "*.dot" -exec dot -Tsvg -O \{} \;

-execの引数で{}を複数回使用できることを指摘しておきます。

find . -name "*.dot" -exec dot -Tsvg -o \{}.svg \{} \;

最初のものが「foo.dot」から「foo.svg」を生成する場合、2番目のものは「foo.dot.svg」を生成します

于 2012-07-12T14:45:44.410 に答える
2

ここでリダイレクトを行うことはできません。シェルではなく、またはフレンドfindを使用して実行します。execvp(3)代わりに、シェルグロブを使用するか、スクリプトを作成して、そこから呼び出すことができますfind

例:

for i in ./*.dot
do
    svg=${i%.dot}.svg
    dot -Tsvg "$i" > "$svg"
done
于 2012-07-12T14:31:47.857 に答える
2

あなたが抱えている問題は、findコマンドの前にリダイレクトが処理されることです。これを回避するには、-exec呼び出しで別のbashプロセスを生成します。これにより、パラメータ展開を使用して拡張機能を簡単に削除することもできます。

find . -name "*.dot" -exec bash -c 'dot -Tsvg "$1" > "${1%.*}".svg' -- {} \;
于 2012-07-12T14:36:47.027 に答える