我正在运行一个脚本,它查看一个目录及其子目录中的所有文件。该脚本已经运行了一天,我想估计它将持续运行多长时间。我知道到目前为止它处理了多少文件(73,000,000),但我不知道文件的总数。什么是最快的方法来计算文件?我试着右键点击目录并选择“属性”,它慢慢地计数。我试着把ls重定向到一个文件,它只是搅拌和搅拌...我应该用C写一个程序吗?
h6my8fg21#
最简单的方法:
find <dir> -type f | wc -l
字符串稍微快一点,也许:
find <dir> -type f -printf '\n' | wc -l
型
s8vozzvw2#
我做了一个快速的研究。使用包含100,000个文件的目录,我比较了以下命令:
ls -R <dir> ls -lR <dir> find <dir> -type f
字符串我运行了两次,一次是重定向到一个文件(>file),一次是管道连接到wc(|wc -l)。以下是以秒为单位的运行时间:
>file
|wc -l
>file |wc ls -R 14 14 find 89 56 ls -lR 91 82
型>file和|wc -l之间的差小于ls和find之间的差。看起来ls -R至少比find快4x。
ls
find
ls -R
kx5bkwkv3#
我知道的最快的:
ls | wc -l
字符串注意:请记住,它列出了目录中的所有节点,包括子目录和对当前目录和父目录的两个引用(.和..)。如果你需要所有子目录中的文件的 recursive count(而不是当前目录中的所有子目录),那么你可以在ls命令中添加“recursive”标志:
.
..
ls -R | wc -l
型如果您将其速度与使用find的建议进行比较,您会发现它要快得多(系数2到10),但请记住上面的注解。
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:
-mindepth 1
-maxdepth 1
-ignore_readdir_race
wc -m /tmp/count.txt
nohup find . -mindepth 1 -maxdepth 1 -ignore_readdir_race -printf x > /tmp/count.txt &
型然后,当您想查看实际计数时:
型或者只是看着它不断增加。。
watch wc -m /tmp/count.txt
型玩得开心
4条答案
按热度按时间h6my8fg21#
最简单的方法:
字符串
稍微快一点,也许:
型
s8vozzvw2#
我做了一个快速的研究。使用包含100,000个文件的目录,我比较了以下命令:
字符串
我运行了两次,一次是重定向到一个文件(
>file
),一次是管道连接到wc(|wc -l
)。以下是以秒为单位的运行时间:型
>file
和|wc -l
之间的差小于ls
和find
之间的差。看起来
ls -R
至少比find
快4x。kx5bkwkv3#
我知道的最快的:
字符串
注意:请记住,它列出了目录中的所有节点,包括子目录和对当前目录和父目录的两个引用(
.
和..
)。如果你需要所有子目录中的文件的 recursive count(而不是当前目录中的所有子目录),那么你可以在
ls
命令中添加“recursive”标志:型
如果您将其速度与使用
find
的建议进行比较,您会发现它要快得多(系数2到10),但请记住上面的注解。aydmsdu94#
ls
根本不快,对于您的目的甚至没有价值:实际上,ls
打印一个按字母顺序排序的条目列表,因此必须等待操作系统返回整个条目列表,对它们进行排序,在标准输出中打印,然后过滤结果以查找换行符。为了一个简单的任务而做了很多工作,甚至更糟:如果某些文件名称中有换行符,则会多次计数。
另一方面,
find
不排序。当缓冲区从文件系统返回时,它还具有立即执行操作的优点,因此您将立即开始看到结果,并且将消耗更少的内存。所以更喜欢这种方法:
字符串
它将在标准输出中为当前目录中找到的每个项目打印一个“x”(不包括当前目录本身,使用
-mindepth 1
),并且不递归(-maxdepth 1
),然后计算字符数。考虑到文件夹已非常满,
-ignore_readdir_race
在计数时将忽略删除文件的错误如果您想知道当前的计数,可以将输出重定向到一个文件(可能在一个tmpfs中,这样所有内容都在内存中,不会产生瓶颈),然后分离进程。当你想知道当前计数器的值时,只需
wc -m /tmp/count.txt
:型
然后,当您想查看实际计数时:
型
或者只是看着它不断增加。。
型
玩得开心