是否有一个bash命令来计算匹配模式的文件数量?
例如,我想获取目录中所有文件的计数,这些文件都符合这个模式:log*
是否有一个bash命令来计算匹配模式的文件数量?
例如,我想获取目录中所有文件的计数,这些文件都符合这个模式:log*
当前回答
对于递归搜索:
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
其他回答
下面是一个可以在脚本中使用的通用Bash函数。
# @see https://stackoverflow.com/a/11307382/430062
function countFiles {
shopt -s nullglob
logfiles=($1)
echo ${#logfiles[@]}
}
FILES_COUNT=$(countFiles "$file-*")
一个重要的评论
(没有足够的声誉来评论)
这是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 -1 log* | wc -l
这意味着每行列出一个文件,然后将其输送到单词计数命令,参数切换到计数行。
这是我经常做的事:
液晶日志* |awk 'END{print NR}'
对于递归搜索:
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