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

时间:2012-07-22 22:33:39

标签: string bash unix

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

a1.txt
a2.txt
a3.txt
b1.txt

我使用以下命令:

ls a*.txt

它将返回:

a1.txt a2.txt a3.txt

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

5 个答案:

答案 0 :(得分:5)

评论使用ls

  1. 我看到所有其他答案都是通过解析输出来尝试的 ls。这是非常不可预测的,因为当你有这个时,这会打破 带有“异常字符”的文件名(例如空格)。
  2. 另一个陷阱是,ls依赖于实施。一个 特定实现可能会以不同的方式格式化输出。
  3. 关于在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)

您可以将lswc结合使用:

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