findコマンドは、 "-exec ... {} +"を使用して提供する引数の数をどのように知ることができますか?

findコマンドは、

次のコマンドで:

find /data ! -type d -exec rm -f {} +

+バッチ実行に使用されますrm -ffindできるだけ多くのパラメータをバッチ処理する必要があります。しかし、限界をどのように知ることができますか?

ベストアンサー1

で指定されたコマンドを呼び出すと、findバッチ引数機能の制限は通常カーネルによって決まります。これは関数系列に与えられる引数の最大サイズです。 POSIXは、パラメータの最大サイズに関連する値を取得する2つの方法を定義します。-exec+execそして環境与えるexec電話

最初のものは定数なので、ビルド時に実行可能ファイルを「含む」ことになります。ARG_MAX絶え間ない存在するlimits.h

パラメータの最大長実装する機能には環境データが含まれます。

2番目は実行時に使用できます。sysconf機能、特に_SC_ARG_MAX議論。

設定された制限ARG_MAX(両方とも{ARG_MAX}変数へのアクセスを提供するため、上記の両方の方法に適用可能)は次のとおりです。POSIXで指定、について-exec

複数のパス名のセットのサイズは、ユーティリティの実行によってシステムの{ARG_MAX}制限を超えないように制限する必要があります。

同じ理由xargs:

これパラメータユーティリティは、コマンドラインが呼び出されたときに結合された引数と環境のリストが表示されるようにコマンドラインの長さを制限する必要があります(参照:実装するシステムインタフェースボリュームのPOSIX.1-2017関数系列は、{ARG_MAX}-2048バイトを超えてはいけません。

さまざまな実装では、これらの制限をさまざまな方法で適用し、時には上記の定数で示された値よりも小さい値を適用します。たとえば、OpenBSDは最大コマンドライン長を確認しますが、ランダムに制限することもありますfindsysconf数字パラメータ数が5000個に達しました。ソースコード詳細(ありがとうございます。モスビー参考用)。 GNUはfindをチェックしsysconf、必要に応じて指定された制限に置き換え、指定された2048バイトの余白を追加しますARG_MAX(GNUとここで実装を共有します)。findxargsfindxargs

特定のカーネルは独自のバリエーションを追加することもできます。コマンドの単一パラメータの最大サイズを定義するものは何ですか?これはLinuxについて議論されています。スタック要件が異なるため、Solaris では、生成されたプロセス ( findORxargsプロセスではなく将来のサブプロセス) が 32 ビットか 64 ビットかによって、考慮すべき制限が異なります。libfind詳細(ありがとうございます。狡猾なポインタの場合)。ハードパラメータ制限はまったくありません。

おすすめ記事