POSIX xargs spe c. говорит:
Сгенерированная длина командной строки должна быть суммой размера в байтах имени утилиты, и каждый аргумент рассматривается как строки, включая нулевой байт-терминатор для каждой из этих строк. Утилита xargs должна ограничивать длину командной строки, чтобы при вызове командной строки комбинированные списки аргументов и среды не превышали {ARG_MAX}-2048
байтов.
Это означает; в вашем случае вывод find не помещается в ARG_MAX ‒ 2048 байт, поэтому xargs объединяет его в 2 набора и вызывает w c один раз для каждого набора.
Возьмем этот конвейер, например, в в идеальном мире его вывод будет 1, но это не так.
seq 1000000 | xargs echo | wc -l
вывод seq - 6888896 байт.
$ seq 1000000 | wc -c
6888896
Мой список окружений занимает 558 байт ( игнорирование того, что _
является динамическим c и учитывает ли реализация для ясности завершающие нулевые указатели).
$ env | wc -c
558
ARG_MAX
в моей системе составляет 131072 байта.
$ getconf ARG_MAX
131072
Теперь xargs имеет 131072‒2048‒558 = 128466 байт; echo
плюс нулевой разделитель занимает 5 байтов, поэтому остается пространство 128461 байта. Поэтому можно сказать, что xargs придется вызывать echo
6888896/128461 = ~ 54 раза. Давайте посмотрим, так ли это:
$ seq 1000000 | xargs echo | wc -l
54
Да, это так.