是否有一个bash命令来计算匹配模式的文件数量?
例如,我想获取目录中所有文件的计数,这些文件都符合这个模式:log*
是否有一个bash命令来计算匹配模式的文件数量?
例如,我想获取目录中所有文件的计数,这些文件都符合这个模式:log*
当前回答
一个重要的评论
(没有足够的声誉来评论)
这是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。
其他回答
要计算所有内容,只需将ls管道到单词计数行:
ls | wc -l
要使用模式计数,首先将管道连接到grep:
ls | grep log | wc -l
一个重要的评论
(没有足够的声誉来评论)
这是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。
如果您有很多文件,并且不想使用优雅的shopt -s nullglob和bash数组解决方案,您可以使用find等,只要不打印文件名(可能包含换行符)。
find -maxdepth 1 -name "log*" -not -name ".*" -printf '%i\n' | wc -l
这将找到所有匹配log*且不以。*开头的文件-“not name .*”是冗余的,但重要的是要注意,“ls”的默认值是不显示点文件,但find的默认值是包含它们。
这是一个正确答案,可以处理任何类型的文件名,因为文件名永远不会在命令之间传递。
但是,shopt nullglob答案是最好的答案!
这是我的一句话。
file_count=$( shopt -s nullglob ; set -- $directory_to_search_inside/* ; echo $#)
这个简单的一行代码可以在任何shell中工作,而不仅仅是bash:
ls -1q log* | wc -l
Ls -1q将为每个文件提供一行,即使它们包含空格或换行符等特殊字符。
输出被输送到wc -l,它计算行数。