我需要计算文件夹下的文件数量并使用以下命令。
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 有一个别名ls
as 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