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

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


当前回答

这个简单的一行代码可以在任何shell中工作,而不仅仅是bash:

ls -1q log* | wc -l

Ls -1q将为每个文件提供一行,即使它们包含空格或换行符等特殊字符。

输出被输送到wc -l,它计算行数。

其他回答

对于递归搜索:

find . -type f -name '*.log' -printf x | wc -c

Wc -c将计算find输出中的字符数,而-printf x告诉find为每个结果打印单个x。这避免了包含换行符等奇怪名称的文件的任何问题。

对于非递归搜索,这样做:

find . -maxdepth 1 -type f -name '*.log' -printf x | wc -c

这是我的一句话。

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

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

这个问题的正确答案由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

您可以使用-R选项来查找递归目录中的文件

ls -R | wc -l // to find all the files

ls -R | grep log | wc -l // to find the files which contains the word log

您可以在grep上使用模式

如果您有很多文件,并且不想使用优雅的shopt -s nullglob和bash数组解决方案,您可以使用find等,只要不打印文件名(可能包含换行符)。

find -maxdepth 1 -name "log*" -not -name ".*" -printf '%i\n' | wc -l

这将找到所有匹配log*且不以。*开头的文件-“not name .*”是冗余的,但重要的是要注意,“ls”的默认值是不显示点文件,但find的默认值是包含它们。

这是一个正确答案,可以处理任何类型的文件名,因为文件名永远不会在命令之间传递。

但是,shopt nullglob答案是最好的答案!