在Linux中,统计目录中文件数量最快/最简单的方法是什么?

13 投票
8 回答
8984 浏览
提问于 2025-04-16 18:05

我有一个文件夹,里面有很多文件。每次我想查看里面的文件列表时,要么无法访问,要么就要等很久。我试着在Linux的命令行中使用ls命令,但我的主机提供商的网页界面也没什么帮助。

问题是,当我只用ls命令时,甚至连开始显示文件都需要很长时间。因此,ls | wc -l这个命令也没用。

经过一些研究,我写了这段代码(这个例子是用来计算某个服务器上新邮件的数量):

print sum([len(files) for (root, dirs, files) in walk('/home/myname/Maildir/new')])

上面的代码是用Python写的。我使用了Python的命令行工具,运行得非常快(结果立刻返回)。

我想知道的是:有没有更快的方法来计算一个文件夹里的文件数量(不包括子文件夹)?最快的方式是什么?

8 个回答

4

给定目录中的文件总数

find . -maxdepth 1 -type f | wc -l

给定目录及其所有子目录中的文件总数

find . -type f | wc -l

想了解更多细节,可以打开终端,输入 man find 来查看帮助

6

在Python中,这个应该会很快:

from os import listdir
from os.path import isfile, join
directory = '/home/myname/Maildir/new'
print sum(1 for entry in listdir(directory) if isfile(join(directory,entry)))
8

ls命令会对每个文件进行一次stat(2)调用,这个调用是用来获取文件的详细信息的。而其他工具,比如find(1)和shell的通配符扩展,可能会跳过这个调用,直接使用readdir来读取文件名。有一个组合命令可以尝试,就是find dir -maxdepth 1|wc -l,不过这个命令会把目录本身也列出来,并且如果文件名中有换行符的话,会导致计数不准确。

在Python中,获取文件名的简单方法是使用os.listdir(directory)。和os.walk以及os.path.walk不同,这个方法不需要递归,也不需要检查文件类型或进行其他的Python函数调用。

补充说明:似乎在某些情况下,ls并不总是进行stat调用。至少在我的GNU系统上,当不需要更多信息(比如哪些名字是目录)时,它可以只进行一次getdents调用。getdents是GNU/Linux中实现readdir的底层系统调用。

补充2:ls输出结果前的延迟有一个原因是它会对结果进行排序和统计。使用ls -U1可能会避免这个问题。

撰写回答