Ainda não tenho certeza se entendi o que você quer, mas combinando a opção -x
("sair se a linha de comando não couber") com a opção -n
definida como um valor enorme (maior que o limite do sistema):
a) certifique-se de que xargs
seja executado apenas uma vez, independentemente de quantos argumentos forem dados a ele
b) erro se os argumentos não puderam ser ajustados em um único comando por causa do OS ou limite interno xargs.
Exemplo:
$ seq 1 10000 | xargs -n 100000000 -x sh -c 'echo "$#"' sh
10000
$ seq 1 100000 | xargs -n 100000000 -x sh -c 'echo "$#"' sh
xargs: argument list too long
Infelizmente, isso não funciona com os xargs BSD ou solaris. No * BSD, a opção -x
fará com que xargs
execute seu comando com um único argumento, em vez de sair:
fz11_2$ jot 10000 1 | xargs -n 10000 -x sh -c 'echo $#' sh | head -3
1
1
1
xargs: sh: terminated with signal 13; aborting
Apenas alguns argumentos ridiculamente pequenos para -s
farão com que -x
seja acionado:
fz11_2$ jot 10000 1 | xargs -s 19 -n 10000 -x sh -c 'echo $#' sh | head -3
xargs: insufficient space for arguments
O padrão parece corresponder ao comportamento xargs do GNU:
-n number Invoke utility using as many standard input arguments as possible, up to number (a positive decimal integer) arguments maximum. Fewer arguments shall be used if: + The command line length accumulated exceeds the size specified by the -s option (or {LINE_MAX} if there is no -s option). + The last iteration has fewer than number, but not zero, operands remaining. -x Terminate if a constructed command line will not fit in the implied or specified size (see the -s option above).