findを使用して複数のファイルからスクリプトを実行するには?

findを使用して複数のファイルからスクリプトを実行するには?

したがって、既定では、複数の.csvファイルを見つけて、すべてのファイルに対して私が作成したスクリプトを使用する必要があります。私は持っています

find . -type f -name "*.csv" | xargs ./extractdata

これは機能しますが、必要なファイルではなく1つのファイルのみを処理します。助ける?

ベストアンサー1

うまくいかないのは、xargsできるだけ多くのファイルをコマンドラインに挿入するためです。

したがって、「extractdata」スクリプトはすべてのファイルを一度に受け取り、おそらく最初のパラメータのみを処理します。つまり、N個のファイルがあり実行します。一つスクリプト対みんなファイルをパラメータとして使用します。

パラメータを使用する必要があります-n

... | xargs -n 1 ./extractdata

したがって、N個のファイルがあり、N個のスクリプトを実行できます。一つファイル固有のパラメーター。

findただし、これはそのオプションを使用して実行するのとほぼ同じです-exec(1つの違いは、ファイルを見つけた順序で処理するのに対し、パイプを使用しておよびsort/またはを使用して渡した後にこれを実行することですgrep)。

find ... -exec /path/to/extractdata \{\} \;

スクリプトの並列実行を使用することもできますparallel。今回は一度に4つのインスタンスを実行します。可能データ、RAM、ハードウェアに基づいて、より効率的な処理をサポートします。

... | parallel -n 1 -j 4 ./extractdata

(「extractdata」が固定名の一時ファイルを使用している場合は良い習慣ではないため、並行して実行される2つ以上のスクリプトが互いの一時ファイルに書き込まれ、問題が発生します)。

おすすめ記事