find コマンドに一致する項目数の制限

find コマンドに一致する項目数の制限

特定の数の一致後にfindコマンドを停止するにはどうすればよいですか?

背景は、フォルダにファイルが多すぎて、ランダムに次のように別のフォルダに配置する必要があることです。

find -max-matches 1000 -exec mv {} /path/to/collection1 \+; 
find -max-matches 1000 -exec mv {} /path/to/collection2 \+; 

これは一人でできますかfind?そうでなければ、最も簡単な方法は何ですか?

ベストアンサー1

find以下を使用して新しいテストを実装できます-exec

seq 1 1000 |
find . -exec read \; -exec mv {} /path/to/collection1 +

見つかった最初の1000ファイルをに移動します/path/to/collection1

仕組みは次のとおりです。

  • seq 1 10001000行を出力しますfind
  • -exec readラインを読み、パイプが閉じると(seq出力が消費された場合)、失敗します。
  • 前の操作が-exec成功した場合、-exec mv ...移動が実行されます。

-exec ... +期待どおりに動作します。read繰り返しごとに1回実行されますが、find一致するファイルを累積し、mvできるだけ少ない数を呼び出します。

これは次の事実によって異なります。find成功-execまたは失敗は、実行コマンドの終了状態によって異なります。read成功した場合は、上記findの操作を処理し続け(基本演算子は「and」なので)、失敗した場合は停止findします。

findこれをサポートしている場合は、-quitこれを使用して効率を向上させることができます。

seq 1 1000 |
find . \( -exec read \; -o -quit \) -exec mv {} /path/to/collection1 +

これがなければ、find1000 だけを維持してもすべてのファイルがテストされますmv

read外部コマンドとして使用できると仮定して実装しました。POSIX仕様read;そうでない場合は、sh -c readそれを代わりに使用できます。どちらの場合も、findスキャンする各ファイルに対して別々のプロセスが開始されます。

おすすめ記事