非常简单的问题:说我有一组文件:
a1.txt
a2.txt
a3.txt
b1.txt
我使用以下命令:
ls a*.txt
它将返回:
a1.txt a2.txt a3.txt
bash脚本中是否有一种方法可以告诉使用*模式时将返回多少结果。在上面的例子中,如果我使用* .txt,答案应该是3,如果我使用* 1.txt,答案应该是2。
答案 0 :(得分:5)
评论使用ls
:
ls
。这是非常不可预测的,因为当你有这个时,这会打破
带有“异常字符”的文件名(例如空格)。ls
依赖于实施。一个
特定实现可能会以不同的方式格式化输出。关于在bash wiki maintained by Greg Wooledge上解析ls输出的缺陷,我们进行了非常好的讨论。
使用bash数组的解决方案
由于上述原因,使用bash语法将是更可靠的选项。您可以使用glob来填充具有所有匹配文件名的bash数组。然后你可以要求bash数组的长度来获得匹配的数量。以下代码段应该有效。
files=(a*.txt) && echo "${#files[@]}"
要保存变量中的匹配数,您可以执行以下操作:
files=(a*.txt)
count="${#files[@]}"
此方法的另一个优点是,您现在还可以在数组中使用匹配文件进行迭代。
注意:虽然我不断重复上面的 bash语法,但我相信上述解决方案适用于所有 sh - 家庭的shell。
答案 1 :(得分:4)
您无法提前知道,但您可以计算返回的结果数量。即。
ls -l *.txt | wc -l
ls -l
将显示与指定通配符匹配的目录条目,wc -l将为您提供计数。
您可以使用
将此命令的值保存在shell变量中 num=$(ls * | wc -l)
或
num=`ls -l *.txt | wc -l`
然后使用$num
来访问它。第一种形式是首选。
答案 2 :(得分:3)
您可以将ls
与wc
结合使用:
ls a*.txt | wc -l
ls
命令列出匹配的文件每行一个,wc -l
计算行数。
答案 3 :(得分:2)
我喜欢suvayu的答案,但不需要使用数组:
count() { echo $#; }
count *
答案 4 :(得分:1)
为了计算可能具有不可预测名称的文件,例如包含换行符,不可打印的字符等,我会使用-print0
的{{1}}选项和find
的{{1}}:
awk
将选项调整为RS='\0'
以优化计数,例如如果条件是以当前目录中带有num=$(find . -maxdepth 1 -print0 | awk -v RS='\0' 'END { print NR }')
扩展名的小写find
开头的文件,请使用:
a