私は最近、多数のファイル(〜400,000)をコピーして移動しています。 Bashコマンドラインで展開できる引数の数には制限があることを知っているので、生成される数を制限するためにxargsを使用しています。
好奇心から、私は使用できる引数の最大数はいくつだろうと思いました、そして、私は this post がシステム依存であり、このコマンドを実行して調べることができると言っていることを発見しました:
$ getconf ARG_MAX
驚いたことに、私が得た答えは次のとおりです。
2621440
260万人以上です。言ったように、私が操作しているファイルの数はこれよりはるかに少なく、約400kです。通常のmv * ...
またはcp * ...
を使用して「引数リストが長すぎます」エラーが発生したため、これらのファイルを移動およびコピーするxargs
メソッドを使用する必要があります。
それで、mv
およびcp
コマンドには、使用できる引数の数に独自の固定制限がありますか(manページに何も見つからなかった)、または何か不足していますか?
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)より長くすることはできません。
_ARG_MAX
_は、exec(3)
関数への引数の最大長です。シェルは、コマンドラインからこの長さの引数を渡すことをサポートする必要はありません。