web-dev-qa-db-ja.com

Bash引数の最大数!=最大数cp引数?

私は最近、多数のファイル(〜400,000)をコピーして移動しています。 Bashコマンドラインで展開できる引数の数には制限があることを知っているので、生成される数を制限するためにxargsを使用しています。

好奇心から、私は使用できる引数の最大数はいくつだろうと思いました、そして、私は this post がシステム依存であり、このコマンドを実行して調べることができると言っていることを発見しました:

$ getconf ARG_MAX

驚いたことに、私が得た答えは次のとおりです。

2621440

260万人以上です。言ったように、私が操作しているファイルの数はこれよりはるかに少なく、約400kです。通常のmv * ...またはcp * ...を使用して「引数リストが長すぎます」エラーが発生したため、これらのファイルを移動およびコピーするxargsメソッドを使用する必要があります。

それで、mvおよびcpコマンドには、使用できる引数の数に独自の固定制限がありますか(manページに何も見つからなかった)、または何か不足していますか?

29
Lee Netherton

Ignacioが言ったように、_ARG_MAX_はexec()に渡される引数のbufferの最大長であり、ファイルの最大数ではありません( このページ は非常に詳細な説明があります)。具体的には、次の条件をチェックするものとして_fs/exec.c_をリストします。

_PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *) / sizeof(void *)
_

そして、あなたはいくつかの追加の制限を持っているようです:

32ビットLinuxでは、これはARGMAX/4-1(32767)です。これは、引数の平均長が4より小さい場合に関係します。Linux2.6.23以降、この関数は、数値が_MAX_ARG_STRINGS_(2 ^ 32-1 = 4294967296-1)の_<linux/binfmts.h>_を超えるかどうかをテストします。また、追加の制限として、1つの引数は_MAX_ARG_STRLEN_(131072)より長くすることはできません。

27
Wyatt Anderson

_ARG_MAX_は、exec(3)関数への引数の最大長です。シェルは、コマンドラインからこの長さの引数を渡すことをサポートする必要はありません。