linux 统计目录(包括子目录)中文件数量的最快方法

ztmd8pv5  于 2023-08-03  发布在  Linux
关注(0)|答案(4)|浏览(134)

我正在运行一个脚本,它查看一个目录及其子目录中的所有文件。
该脚本已经运行了一天,我想估计它将持续运行多长时间。我知道到目前为止它处理了多少文件(73,000,000),但我不知道文件的总数。
什么是最快的方法来计算文件?
我试着右键点击目录并选择“属性”,它慢慢地计数。我试着把ls重定向到一个文件,它只是搅拌和搅拌...
我应该用C写一个程序吗?

h6my8fg2

h6my8fg21#

最简单的方法:

find <dir> -type f | wc -l

字符串
稍微快一点,也许:

find <dir> -type f -printf '\n' | wc -l

s8vozzvw

s8vozzvw2#

我做了一个快速的研究。使用包含100,000个文件的目录,我比较了以下命令:

ls -R <dir>
ls -lR <dir>
find <dir> -type f

字符串
我运行了两次,一次是重定向到一个文件(>file),一次是管道连接到wc(|wc -l)。以下是以秒为单位的运行时间:

>file   |wc
ls -R     14     14
find      89     56
ls -lR    91     82


>file|wc -l之间的差小于lsfind之间的差。
看起来ls -R至少比find4x

kx5bkwkv

kx5bkwkv3#

我知道的最快的:

ls | wc -l

字符串
注意:请记住,它列出了目录中的所有节点,包括子目录和对当前目录和父目录的两个引用(...)。
如果你需要所有子目录中的文件的 recursive count(而不是当前目录中的所有子目录),那么你可以在ls命令中添加“recursive”标志:

ls -R | wc -l


如果您将其速度与使用find的建议进行比较,您会发现它要快得多(系数2到10),但请记住上面的注解。

aydmsdu9

aydmsdu94#

ls根本快,对于您的目的甚至没有价值:实际上,ls打印一个按字母顺序排序的条目列表,因此必须等待操作系统返回整个条目列表,对它们进行排序,在标准输出中打印,然后过滤结果以查找换行符。
为了一个简单的任务而做了很多工作,甚至更糟:如果某些文件名称中有换行符,则会多次计数。
另一方面,find不排序。当缓冲区从文件系统返回时,它还具有立即执行操作的优点,因此您将立即开始看到结果,并且将消耗更少的内存。
所以更喜欢这种方法:

find . -mindepth 0 -maxdepth 0 -ignore_readdir_race -prinf x | wc -m

字符串
它将在标准输出中为当前目录中找到的每个项目打印一个“x”(不包括当前目录本身,使用-mindepth 1),并且不递归(-maxdepth 1),然后计算字符数。
考虑到文件夹已非常满,-ignore_readdir_race在计数时将忽略删除文件的错误
如果您想知道当前的计数,可以将输出重定向到一个文件(可能在一个tmpfs中,这样所有内容都在内存中,不会产生瓶颈),然后分离进程。当你想知道当前计数器的值时,只需wc -m /tmp/count.txt

nohup find . -mindepth 1 -maxdepth 1 -ignore_readdir_race -printf x > /tmp/count.txt &


然后,当您想查看实际计数时:

wc -m /tmp/count.txt


或者只是看着它不断增加。。

watch wc -m /tmp/count.txt


玩得开心

相关问题