Bash 什么是最好的计数方法;查找“;结果?

Bash 什么是最好的计数方法;查找“;结果?,bash,find,Bash,Find,我当前的解决方案是find-exec printf'.\ |wc-c,但当结果超过10000个时,这需要花费太长的时间。没有更快/更好的方法可以做到这一点吗?为什么没有 find <expr> | wc -l find | wc-l 作为一个简单的便携式解决方案?您最初的解决方案是为找到的每个文件生成一个新的进程printf,这非常昂贵(正如您刚刚发现的那样) 请注意,如果您的文件名中嵌入了换行符,这将导致计算过多,但如果您有,则我怀疑您的问题会更深一些。请尝试此操作(需要查找的

我当前的解决方案是
find-exec printf'.\ |wc-c
,但当结果超过10000个时,这需要花费太长的时间。没有更快/更好的方法可以做到这一点吗?

为什么没有

find <expr> | wc -l
find | wc-l
作为一个简单的便携式解决方案?您最初的解决方案是为找到的每个文件生成一个新的进程
printf
,这非常昂贵(正如您刚刚发现的那样)

请注意,如果您的文件名中嵌入了换行符,这将导致计算过多,但如果您有,则我怀疑您的问题会更深一些。

请尝试此操作(需要
查找
-printf
支持):

我的代码段基准:

$ 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

因此,我的解决方案更快=)(重要的部分是
实数
行)

这是我
~/.bashrc中的
countfiles
函数(它相当快,应该适用于Linux和FreeBSD
find
,并且不会被包含换行符的文件路径所愚弄;最后的
wc
只计算NUL字节):


这个解决方案当然比这里的其他一些
find->wc
解决方案要慢,但是如果除了计算文件名之外,您还倾向于对文件名执行其他操作,那么您可以
find
输出中读取

n=0
while read -r -d ''; do
    ((n++)) # count
    # maybe perform another act on file
done < <(find <expr> -print0)
echo $n
n=0
当读取-r-d“”时;执行
((n++)计数
#也许再进行一次存档

done<在find结果上使用wc-l不等效,它更可靠=)如果您的平台不支持-printf标志查找,它就不可靠了。;-)请注意,您可以通过不引用
-printf'.
@Jens'中的点来节省几纳秒的时间。特别是当您考虑到键入时间时,在这样一个小的基准测试中,计时可能由其他因素控制,而不是您想要测量的内容。用一棵大树做实验会更有用。但是这得到了我的投票,因为我确实做了OP要求的事情。-1:威尔用换行符打断文件,比计算字节还慢=)我不;鉴于文件名/换行符的限制非常罕见,并且如上所述,我认为这不值得投反对票。更慢的?也许。鉴于您正在查询文件系统,我怀疑速度差异很小。在我的10000个文件中,我测量了3ms的差异“find | wc-l”和“find-printf”之间的性能差异|wc-c'非常小。缓存(即,如果在同一棵树上运行相同的查找两次)更为重要。IMHO使用“wc-l”的解决方案更直观。
$ time find -type f | wc -l
8

real    0m0.006s
user    0m0.003s
sys     0m0.000s
countfiles () 
{ 
   command find "${1:-.}" -type f -name "${2:-*}" -print0 | 
       command tr -dc '\0' | command wc -c;
return 0
}

countfiles

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