“ls | wc -l”的结果与实际文件数不匹配

“ls | wc -l”的结果与实际文件数不匹配

我需要计算文件夹下的文件数量并使用以下命令。

cd testfolder
bash-4.1$ ls | wc -l
6

其实这个文件夹下只有五个文件,

bash-4.1$ ls
total 44
-rw-r--r-- 1 comp 11595 Sep  4 22:51 30.xls.txt
-rw-r--r-- 1 comp 14492 Sep  4 22:51 A.pdf.txt
-rw-r--r-- 1 comp  8160 Sep  4 22:51 comparison.docx.txt
-rw-r--r-- 1 comp   903 Sep  4 22:51 Survey.pdf.txt
-rw-r--r-- 1 comp  1206 Sep  4 22:51 Steam Table.xls.txt

看起来ls | wc -l甚至将其算作total 44一个文件,这是不正确的。

答案1

只是上述内容的额外信息,

如果您想处理输出,您应该使用find而不是,它有一些更适合(例如)将结果通过管道传输到其他应用程序的未来。ls-print0

在上面的情况下,你可以像这样使用它,

find . -type f | wc -l

这将列出任何文件在当前目录上。

答案2

它不起作用,因为wc -l返回命令输出的行数ls,在本例中包括total 44.由于您的 shell 有一个别名lsas ls -cml,您将获得额外的信息,这会扰乱您的输出。

相反,请使用命令"ls" -Aq | wc -l。 -A 命令列出目录中的所有文件,包括点文件,但不包括....这里的引用很重要——它们忽略别名并/bin/ls直接运行。

-q确保文件名仅打印在一行上,即使它们包含换行符(然后将呈现为?)。

答案3

wc是字符、字和行计数器,而不是文件计数器。

作为程序员/脚本编写者,您有责任使其计算出您想要的结果并相应地调整计算。

对于你的情况,你可以这样做:

echo $((`ls|wc -l`-1))

最后请注意,您ls可能是一个别名,因为它给出了一个很长的列表,这在没有参数的情况下是不正常的ls。因此,(通常)参考 的ls完整路径可能是一个好主意/bin/ls,以避免混淆。

答案4

bash-4.1$ ls
1. total 44
2. -rw-r--r-- 1 comp 11595 Sep  4 22:51 30.xls.txt
3. -rw-r--r-- 1 comp 14492 Sep  4 22:51 A.pdf.txt
4. -rw-r--r-- 1 comp  8160 Sep  4 22:51 comparison.docx.txt
5. -rw-r--r-- 1 comp   903 Sep  4 22:51 Survey.pdf.txt
6. -rw-r--r-- 1 comp  1206 Sep  4 22:51 Steam Table.xls.txt

没错,输出中有 6 行。您可能想要使用:ls -1对应于单列格式,它看起来像这样:

ls -1
Desktop
Documents
Downloads
Music
Pictures
Public
Templates
Videos

现在wc -l返回正确的文件数量:

ls -1 | wc -l
8

相关内容