是否有一个bash命令来计算匹配模式的文件数量?

例如,我想获取目录中所有文件的计数,这些文件都符合这个模式:log*


当前回答

这是我经常做的事:

液晶日志* |awk 'END{print NR}'

其他回答

这个问题的公认答案是错误的,但我有低代表,所以不能添加评论。

这个问题的正确答案由Mat给出:

shopt -s nullglob
logfiles=(*.log)
echo ${#logfiles[@]}

接受的答案的问题是wc -l计算换行符的数量,即使它们打印到终端,也将它们计算为'?'ls -l'的输出。这意味着当文件名包含换行符时,接受的答案失败。我已经测试了建议的命令:

ls -l log* | wc -l

而且即使只有一个文件名恰好包含换行符的文件与模式匹配,它也会错误地报告值2。例如:

touch log$'\n'def
ls log* -l | wc -l
ls -1 log* | wc -l

这意味着每行列出一个文件,然后将其输送到单词计数命令,参数切换到计数行。

这是我经常做的事:

液晶日志* |awk 'END{print NR}'

一个重要的评论

(没有足够的声誉来评论)

这是BUGGY:

ls -1q some_pattern | wc -l

如果shop -s nullglob恰好被设置,它将打印所有常规文件的数量,而不仅仅是带有模式的文件的数量(在CentOS-8和Cygwin上测试)。谁知道他还有什么没用的毛病?

这是正确的,而且更快:

shopt -s nullglob; files=(some_pattern); echo ${#files[@]};

它完成了预期的工作。 运行时间不同。 第一个:CentOS是0.006,Cygwin是0.083(以防小心使用)。 第二:CentOS是0.000,Cygwin是0.003。

这是我的一句话。

 file_count=$( shopt -s nullglob ; set -- $directory_to_search_inside/* ; echo $#)