O limite para a capacidade de find
de argumentos em lote, ao invocar um comando especificado por -exec
com +
, é normalmente determinado pelo kernel: é o tamanho máximo dos argumentos fornecidos para o exec
família de funções. O POSIX define duas maneiras de descobrir um valor relacionado a isso, o tamanho máximo dos argumentos e ambiente dado a uma chamada exec
.
O primeiro deles é uma constante, que, portanto, acaba “cozido” em executáveis quando eles são construídos; é a constante ARG_MAX
em limits.h
:
Maximum length of argument to the exec functions including environment data.
O segundo deles está disponível em tempo de execução: envolve o uso de a função sysconf
, especificamente com o argumento _SC_ARG_MAX
.
O limite definido por ARG_MAX
(que se aplica a ambas as abordagens descritas acima, já que ambos fornecem acesso à variável “{ARG_MAX}”) é especificado por POSIX , em relação a -exec
:
The size of any set of two or more pathnames shall be limited such that execution of the utility does not cause the system's {ARG_MAX} limit to be exceeded.
O mesmo é válido para xargs
:
The xargs utility shall limit the command line length such that when the command line is invoked, the combined argument and environment lists (see the exec family of functions in the System Interfaces volume of POSIX.1-2017) shall not exceed {ARG_MAX}-2048 bytes.
Várias implementações aplicam esses limites de várias maneiras, às vezes aplicando valores menores do que as constantes acima indicariam. Por exemplo, o OpenBSD find
verifica sysconf
, para determinar o comprimento máximo da linha de comando, mas também limita arbitrariamente o número de argumentos para 5000; veja o código fonte para detalhes (graças a mosvy para a referência). find
do GNU verifica sysconf
e volta se necessário para ARG_MAX
ou um limite find
-specificado; Além disso, ele adiciona o headroom de 2048 bytes especificado para xargs
(o% GNU find
e xargs
compartilham sua implementação aqui).
Os kernels específicos também podem adicionar suas próprias torções. O que define o tamanho máximo para um único argumento de comando? discute isso para o Linux. O Solaris aparentemente requer diferentes limites a serem considerados, dependendo se o processo gerado (não o processo find
ou xargs
, mas o futuro processo filho) é de 32 ou 64 bits, devido à variação dos requisitos de pilha; veja libfind
para detalhes (graças a schily para o ponteiro). O Hurd não limita os argumentos .