计算“发现”结果的最佳方法是什么?


96

我当前的解决方案是find <expr> -exec printf '.' \; | wc -c,但是当结果超过10000时,这将花费太长时间。有没有更快/更好的方法来做到这一点?


在发现的结果上使用wc -l
Manuel Selva

Answers:


82

试试这个(需要find-printf支持):

find <expr> -type f -printf '.' | wc -c

它比计数行数更可靠,更快。

请注意,我使用的findprintf,而不是外部命令。


让我们坐下:

$ ls -1
a
e
l
ll.sh
r
t
y
z

我的摘要基准:

$ time find -type f -printf '.' | wc -c
8

real    0m0.004s
user    0m0.000s
sys     0m0.007s

用实线表示:

$ time find -type f | wc -l
8

real    0m0.006s
user    0m0.003s
sys     0m0.000s

所以我的解决方案更快=)(重要的部分是real线路)


6
不相等,它更可靠=)
Gilles Quenot

6
如果平台上不支持要查找的-printf标志,那不是更可靠。;-)
Randy Howard

7
请注意,您可以通过不引用点号来减少几纳秒的时间-printf '.'
Jens

6
@Jens-特别是考虑到键入时间
Brian Agnew

6
在如此小的基准下,计时可能受到其他因素的影响,而不是您想要测量的东西。用一棵大树进行实验会更有用。但这获得了我对OP实际执行操作的投票。
人间

132

为什么不

find <expr> | wc -l

作为一个简单的便携式解决方案?您最初的解决方案是为找到的每个单个文件产生一个新的过程 printf,这非常昂贵(就像您刚刚发现的那样)。

请注意,如果您嵌入了带有换行符的文件名,这将是多余的,但是如果您拥有该文件名,那么我怀疑您的问题会更加深入。


9
-1:将以换行符在文件上中断,并且比计数字节还要慢=)
Gilles Quenot 2013年

21
我不认为这是值得推荐的,因为文件名/换行符的限制非常少见并且已在上面指出。慢点 ?也许。考虑到您正在查询文件系统,我怀疑速度差异很小。在我的10,000个文件中,我测量的差异为
Brian Agnew

8
'find <expr> | wc -l'和'find <expr> -printf之间的性能差异。| wc -c'非常小。缓存(即,如果在同一棵树上运行两次相同的查找)更为重要。恕我直言,“ wc -l”解决方案要直观得多。
pitseeker

4

这个解决方案肯定比find -> wc这里的其他解决方案要慢,但是如果您除了对文件名进行计数之外,还打算对文件名进行其他操作,则可以readfind输出中进行选择。

n=0
while read -r -d ''; do
    ((n++)) # count
    # maybe perform another act on file
done < <(find <expr> -print0)
echo $n

这只是对BashGuide中解决方案的修改,该解决方案通过使用将find输出定界符设为NUL字节print0,并使用''(NUL字节)作为循环定界符来读取文件,从而正确处理具有非标准名称的文件。


3

这是我的countfiles功能~/.bashrc(运行速度相当快,应该适用于Linux和FreeBSD find,并且不会被包含换行符的文件路径所迷惑;最终wc仅计数NUL字节):

countfiles () 
{ 
   command find "${1:-.}" -type f -name "${2:-*}" -print0 | 
       command tr -dc '\0' | command wc -c;
return 0
}

countfiles

countfiles ~ '*.txt'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.