【问题标题】:Shell script: Count number of files in a particular type extension in single folderShell脚本:计算单个文件夹中特定类型扩展名的文件数
【发布时间】:2014-11-02 15:37:51
【问题描述】:

我是 shell 脚本的新手。 我需要使用 shell 脚本将具有特定扩展名(.properties)的文件的数量保存在一个变量中。

我用过

ls |grep .properties$ |wc -l

但是这个命令会打印文件夹中属性文件的数量。如何在变量中分配这个值。

我试过了

count=${ls |grep .properties$ |wc -l}

但它显示如下错误:

./replicate.sh: line 57: ${ls |grep .properties$ |wc -l}: bad substitution
  • 这种类型的错误是什么?
  • 请任何人帮助我将特定文件的数量保存在变量中以备将来使用。

【问题讨论】:

    标签: shell sh ls


    【解决方案1】:

    您使用了错误的括号,它应该是$()(命令输出替换)而不是${}(变量替换)。

    count=$(ls -1 | grep '\.properties$' | wc -l)
    

    您还会注意到我使用ls -1强制每行一个文件,以防您的ls 不会自动为管道执行此操作,并更改了模式以匹配. 正确。

    如果你使用类似的东西,你也可以完全绕过grep

    count=$(ls -1 *.properties 2>/dev/null | wc -l)
    

    请注意“邪恶”文件名,例如嵌入换行符的文件名,尽管我的ls 似乎可以通过用? 字符替换换行符来处理这些问题 - 这对于 来说不一定是个好主意 对文件进行处理,但对它们进行计数也可以。

    如果您有这样的野兽并且需要 实际 文件名,则可以使用更好的工具,但它们很少见,您通常不必担心。

    【讨论】:

      【解决方案2】:

      您可以使用带通配符的循环:

      count=0
      for i in *.properties; do
          count=$((count+1))
      done
      

      【讨论】:

        【解决方案3】:

        如果您使用的是支持数组的 shell,您可以简单地捕获所有此类文件名

        files=( *.properties )
        

        然后确定数组元素个数

        count=${#files[@]}
        

        (以上假设bash;其他shell 可能需要稍有不同的语法。)

        【讨论】:

        • 应该是count=$#fileszshell。
        【解决方案4】:

        你最好使用find,而不是解析ls。然后,使用var=$(command) 语法来存储值。

        var=$(find . -maxdepth 1 -name "*\.properties" | wc -l)
        

        参考:Why you shouldn't parse the output of ls


        要解决任何文件名包含换行的问题,您可以使用chepner suggests in the comments

        var=$(find . -maxdepth 1 -name "*\.properties" -exec 'echo 1' | wc -l)
        

        因此对于每个匹配,它不会打印名称,而是任何随机字符(在本例中为1),然后将计算它们的数量以产生正确的输出。

        【讨论】:

        • 失败的原因与ls *.properties 相同;带有换行符的文件名将占用超过 1 行。您至少需要使用 -exec 'echo 1' 之类的东西来代替默认的 -print,以确保每个文件只有一行输出。
        【解决方案5】:

        用途:

        count=`ls|grep .properties$ | wc -l`
        echo $count
        

        【讨论】:

        • 结果显示为零。但实际结果是3。:(
        • 它对我有用。您确定文件夹中有带有此扩展名的文件吗?
        【解决方案6】:

        你可以这样写你的作业:

        count=$(ls -q | grep -c '\.properties$')
        

        count=$(ls -qA | grep -c '\.properties$')
        

        如果您想包含隐藏文件。
        这适用于所有类型的文件名,因为我们使用 lsq
        当然,链接到一些告诉您“从不解析 ls” 的网页比阅读 ls 手册并看到有一个 q 选项更容易(并且大多数实现默认为 q如果输出是到终端设备,这就解释了为什么这里有些人声明他们的ls 似乎可以通过用? 字符替换换行符来处理带有换行符的文件名)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-14
          • 1970-01-01
          • 2010-11-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-21
          • 1970-01-01
          相关资源
          最近更新 更多