显然我数不过来。我认为里面有三个文件/media
$ tree /media
/media
├── foo
├── onex
└── zanna
3 directories, 0 files
但是,ls -l
找到 12 个。
$ ls -l /media
total 12
drwxr-xr-x 2 root root 4096 Jul 31 20:57 foo
drwxrwxr-x 2 root root 4096 Jun 26 06:36 onex
drwxr-x---+ 2 root root 4096 Aug 7 21:17 zanna
而且,如果我这样做,除了上述之外,ls -la
我只会得到,但计数是.
..
total 20
有什么解释?
你看到的
12
不是文件数,而是消耗的磁盘块数。来自
info coreutils 'ls invocation'
:当您使用而不是因为您正在计算两个额外的目录时,总数会从
12
到:和. 您为每个(空)目录使用四个磁盘块,因此您的总数从 3 × 4 变为 5 × 4。(很可能,您为每个目录使用一个4096 字节的磁盘块;如页面所示,实用程序不检查磁盘格式,但除非另有说明,否则假定块大小为 。)20
ls -la
ls -l
.
..
info
1024
如果您想简单地获取文件数,您可以尝试类似
user4556274 已经回答了为什么。我的回答仅用于提供有关如何正确计算文件的其他信息。
在 Unix 社区中,普遍的共识是解析 的输出
ls
是一个非常非常糟糕的主意,因为文件名可以包含控制字符或隐藏字符。例如,由于文件名中有换行符,我们ls | wc -l
告诉我们(它确实有)的输出中有 5 行ls
,但实际上目录中只有 4 个文件。方法#1:查找实用程序
该
find
命令通常用于解析文件名,可以通过打印inode number来帮助我们。无论是目录还是文件,它都只有一个唯一的 inode 编号。因此,使用-printf "%i\n"
和排除.
通过-not -name "."
我们可以准确计数文件。(注意使用-maxdepth 1
防止递归下降到子目录)方法#2:globstar
简单、快速且最便携的方式:
set
命令用于设置 shell 的位置参数($<INTEGER>
变量,如 中echo $1
)。这通常用于解决/bin/sh
缺少数组的限制。可以在Gille在 Unix&Linux 上的回答中找到执行额外检查的版本。在支持数组的 shell 中,例如
bash
,我们可以使用正如Steeldriver 在评论中提出的那样。
与使用和 globstar的
find
方法类似的技巧可用于计算每行的 inode 数量:wc
stat
另一种方法是在
for
循环中使用通配符。(注意,此测试使用不同的目录来测试此方法是否下降到子目录,它没有 - 16 是经过验证的 my 中的项目数~/bin
)方法#3:其他语言/口译员
Python 还可以通过打印给定我的
os.listdir()
函数的列表长度来处理有问题的文件名(这是非递归的,并且只会列出作为参数给出的目录中的项目)。也可以看看