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つ以上のスクリプトが互いの一時ファイルに書き込まれ、問題が発生します)。

答え2

別のオプションはfdツールです。

fd csv -x ./extractdata

https://github.com/sharkdp/fd

答え3

findこの問題を解決する方法はいくつかあります。たとえば、スクリプトが次のように呼び出されるように要求できます。

 $ find . -type f -name "*.csv" -exec your_script {} ;

{} は毎回見つかるファイル名です。

次の文字をエスケープする必要があります。

 $ find . -type f -name "*.csv" -exec your_script \{\} \;

関連情報