如何在unix中告知有多少文件与*匹配描述

Fan*_*Fox 2 unix string bash

很简单的问题:说我有一组文件:

a1.txt
a2.txt
a3.txt
b1.txt
Run Code Online (Sandbox Code Playgroud)

我使用以下命令:

ls a*.txt
Run Code Online (Sandbox Code Playgroud)

它将返回:

a1.txt a2.txt a3.txt
Run Code Online (Sandbox Code Playgroud)

在使用*模式时,是否有一种方法可以告诉bash脚本将返回多少结果.在上面的例子中,如果我使用*.txt,答案应该是3,如果我使用*1.txt,答案应该是2.

suv*_*ayu 5

评论使用ls:

  1. 我看到所有其他答案通过解析输出来尝试这个 ls.这是非常不可预测的,因为当文件名具有"异常字符"(例如空格)时会中断.
  2. 另一个陷阱是,它ls依赖于实现.特定实现可能以不同方式格式化输出

关于在Greg Wooledge维护bash wiki上解析ls输出的缺陷,有一个非常好的讨论 .

使用bash数组的解决方案

由于上述原因,使用bash语法将是更可靠的选项.您可以使用glob来填充具有所有匹配文件名的bash数组.然后你可以要求bash数组的长度来获得匹配的数量.以下代码段应该有效.

files=(a*.txt) && echo "${#files[@]}"
Run Code Online (Sandbox Code Playgroud)

要保存变量中的匹配数,您可以执行以下操作:

files=(a*.txt)
count="${#files[@]}"
Run Code Online (Sandbox Code Playgroud)

此方法的另一个优点是,您现在还可以在数组中匹配文件,您可以迭代它们.

注意:虽然我不断重复上面的bash语法,但我相信上面的解决方案适用于所有sh -family shell.