xargs wc -l 报告两个总计

it_*_*ure 1 bash xargs wc

我想计算目录中的所有行/usr/local/lib/python3.5/dist-packages/pandas

cd /usr/local/lib/python3.5/dist-packages/pandas
find  -name '*.*' |xargs  wc -l
536577 total
Run Code Online (Sandbox Code Playgroud)

将两行写成一行。

 find  /usr/local/lib/python3.5/dist-packages/pandas  -name '*.*' |xargs wc -l    
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

bash 输出两个total数字,一个是495736,另一个是40841,

495736 + 40841 = 536577
Run Code Online (Sandbox Code Playgroud)

为什么 bash 不只536577在底部给出一个总计,例如find -name '*.*' |xargs wc -ldo?

ogu*_*ail 5

POSIX xargs 规范。说:

\n\n
\n

生成的命令行长度应为实用程序名称和被视为字符串的每个参数的字节大小之和,包括每个字符串的空字节终止符。xargs 实用程序应限制命令行长度,以便在调用命令行时,组合的参数和环境列表不应超过{ARG_MAX}-2048字节。

\n
\n\n

这意味着;在您的情况下, find 的输出不适合 ARG_MAX\xe2\x80\x922048 字节,因此 xargs 将其聚合为 2 组,并为每组调用一次 wc 。

\n\n
\n\n

以此管道为例,在理想情况下,其输出将为 1,但事实并非如此。

\n\n
seq 1000000 | xargs echo | wc -l\n
Run Code Online (Sandbox Code Playgroud)\n\n

seq 的输出是 6888896 字节。

\n\n
$ seq 1000000 | wc -c\n6888896\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的环境列表占用 558 个字节(为了清楚起见,忽略它_是动态的以及实现是否考虑终止空指针)。

\n\n
$ env | wc -c\n558\n
Run Code Online (Sandbox Code Playgroud)\n\n

ARG_MAX在我的系统上是 131072 字节。

\n\n
$ getconf ARG_MAX\n131072\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在 xargs 有 131072\xe2\x80\x922048\xe2\x80\x92558 = 128466 字节;echo加上空分隔符占用5个字节,所以还剩下128461个字节的空间。因此我们可以说,xargs 必须调用echo6888896/128461 = ~54 次。让我们看看是不是这样:

\n\n
$ seq 1000000 | xargs echo | wc -l\n54\n
Run Code Online (Sandbox Code Playgroud)\n\n

是的。

\n