23

にデータを書き込むだけのスクリプトが 1 つありますstdout。複数のファイルに対して実行し、入力ファイルごとに異なる出力ファイルを生成する必要があり、find -execそのためにどのように使用するのか疑問に思っていました。catだから私は基本的にこれのいくつかの変種を試しました(私はテスト容易性の目的でスクリプトを置き換えました):

find * -type f -exec cat "{}" > "{}.stdout" \;

しかし、すべてのデータが文字通り名前が付けられたファイルに書き込まれていたため、機能させることができませんでした{}.stdout

最終的に、私はそれを動作させることができました:

find * -type f -exec sh -c "cat {} > {}.stdout" \;

しかし、この最新の形式は でうまく機能しますがcat、私のスクリプトではいくつかの初期化スクリプトを介して環境変数をロードする必要があるため、最終的には次のようになります。

find * -type f -exec sh -c "initscript1; initscript2; ...;  myscript {} > {}.stdout" \;

現在のシェルですべてが既に初期化されているため、これは無駄に思えます。

でこれを行うより良い方法はありfindますか? 他のワンライナーは大歓迎です。

4

3 に答える 3

20

あなたはevalでそれを行うことができます。醜いかもしれませんが、これにはシェルスクリプトを作成する必要があります。さらに、すべてが 1 行で表示されます。例えば

find -type f -exec bash -c "eval md5sum {}  > {}.sum " \;
于 2014-08-26T13:58:03.370 に答える
9

簡単な解決策は、スクリプトの周りにラッパーを配置することです。

#!/bin/sh

myscript "$1" > "$1.stdout"

それmyscript2を呼び出して、find で呼び出します。

find . -type f -exec myscript2 {} \;

find のほとんどの実装では、実行したことを実行できますが、技術的には{}、 の引数リストで複数回使用した場合の動作は規定されていないことに注意してください-exec

于 2013-02-22T19:06:58.800 に答える