是否有一个bash命令来计算匹配模式的文件数量?
例如,我想获取目录中所有文件的计数,这些文件都符合这个模式:log*
是否有一个bash命令来计算匹配模式的文件数量?
例如,我想获取目录中所有文件的计数,这些文件都符合这个模式:log*
当前回答
这个问题的公认答案是错误的,但我有低代表,所以不能添加评论。
这个问题的正确答案由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
这意味着每行列出一个文件,然后将其输送到单词计数命令,参数切换到计数行。
这个问题的公认答案是错误的,但我有低代表,所以不能添加评论。
这个问题的正确答案由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上使用模式
你可以用bash安全地做到这一点(即不会被名称中有空格或\n的文件所bug):
$ shopt -s nullglob
$ logfiles=(*.log)
$ echo ${#logfiles[@]}
您需要启用nullglob,以便在没有匹配的文件时不会在$logfiles数组中获得*.log文本。(参见如何“撤消”一个“set -x”?有关如何安全重置的示例。)
这个简单的一行代码可以在任何shell中工作,而不仅仅是bash:
ls -1q log* | wc -l
Ls -1q将为每个文件提供一行,即使它们包含空格或换行符等特殊字符。
输出被输送到wc -l,它计算行数。