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

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


当前回答

你可以用bash安全地做到这一点(即不会被名称中有空格或\n的文件所bug):

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

您需要启用nullglob,以便在没有匹配的文件时不会在$logfiles数组中获得*.log文本。(参见如何“撤消”一个“set -x”?有关如何安全重置的示例。)

其他回答

对于递归搜索:

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

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

ls -1q log* | wc -l

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

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

你可以用bash安全地做到这一点(即不会被名称中有空格或\n的文件所bug):

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

您需要启用nullglob,以便在没有匹配的文件时不会在$logfiles数组中获得*.log文本。(参见如何“撤消”一个“set -x”?有关如何安全重置的示例。)

ls -1 log* | wc -l

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

下面是一个可以在脚本中使用的通用Bash函数。

    # @see https://stackoverflow.com/a/11307382/430062
    function countFiles {
        shopt -s nullglob
        logfiles=($1)
        echo ${#logfiles[@]}
    }

    FILES_COUNT=$(countFiles "$file-*")