![为什么是| wc 在 dir 中输出 3 行,其中包含 3 个单行文件?](https://linux22.com/image/144293/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%98%AF%7C%20wc%20%E5%9C%A8%20dir%20%E4%B8%AD%E8%BE%93%E5%87%BA%203%20%E8%A1%8C%EF%BC%8C%E5%85%B6%E4%B8%AD%E5%8C%85%E5%90%AB%203%20%E4%B8%AA%E5%8D%95%E8%A1%8C%E6%96%87%E4%BB%B6%EF%BC%9F%20.png)
$ ls
1.txt 2.txt 3.txt
$ ls | wc
3 3 18
所有三个文件都只有 1 行,但 ls|wc 输出“3”。
答案1
尝试ls | cat
看看 ls 在通过管道传输时与发送到终端时的输出格式有何不同。
答案2
ls
,当输出到终端以外的任何设备时,其行为类似于ls -1
(这是数字1
,而不是“ell”)并在新行上输出每个名称。
如果您想计算ls
输出中的行数(如果根本没有通过管道传输的话),请使用ls -C
。无论输出指向何处,都可以强制执行多列输出-C
。ls
也就是说,使用
ls -C | wc
或者,为了获取行数,
ls -C | wc -l
另一方面,如果您想分别计算三个文件中的行数,您可以使用
wc -l -- *
如果每个文件只包含一行,这将导致输出
1 1.txt
1 2.txt
1 3.txt
3 total
即每个文件包含一行,三个文件的总行数为三。
这不同之处之间wc -l -- *
(ls -C | wc -l
或者,ls | wc
如您所写),是从哪里wc
获取输入的。
与ls -C | wc -l
,wc
读取自的输出ls
因此会计算命令生成的行数ls
。不是任何文件中的行数。
有了wc -l -- *
,我们告诉wc
阅读特定文件。在这种情况下,文件对应于通配符(“文件名通配模式”)*
扩展的名称。
wc -l -- *
相当于wc -l -- 1.txt 2.txt 3.txt
目录中只有这些文件。
请注意,如果调用当前目录中的文件-
,则无法正常工作,因为会将参数wc
解释-
为含义标准输入。解决这个问题的一种方法是使用wc -l ./*
代替(./-
对 来说并不特殊wc
),但这意味着./
前缀也会显示在 的输出中wc
。
答案3
ls
给你 3 列,这与单行不同,因此wc
在每列结束后计算新行。换句话说,ls
输出格式化文本,即使您看不到。但wc
确实如此。