特定の数の一致後に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 1000
1000行を出力します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 +
これがなければ、find
1000 だけを維持してもすべてのファイルがテストされますmv
。
read
外部コマンドとして使用できると仮定して実装しました。POSIX仕様read
;そうでない場合は、sh -c read
それを代わりに使用できます。どちらの場合も、find
スキャンする各ファイルに対して別々のプロセスが開始されます。