Shell脚本:计算单个文件夹中特定类型扩展名中的文件数

时间:2014-09-09 09:14:27

标签: shell sh ls

我是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
  • 这类错误是什么?
  • 请任何人帮我保存变量中特定文件的数量以备将来使用。

6 个答案:

答案 0 :(得分:4)

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

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

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

如果您使用以下内容,也可以完全绕过grep

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

请注意“邪恶”文件名,例如那些带有嵌入式换行符的文件名,尽管我的ls似乎通过用?字符替换换行符来处理这些问题 - 这不一定是个好主意用文件做事情,但它可以计算它们。

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

答案 1 :(得分:4)

你可以使用带有globbing的循环:

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

答案 2 :(得分:3)

如果您使用的是支持数组的shell,则只需捕获所有此类文件名

即可
files=( *.properties )

然后确定数组元素的数量

count=${#files[@]}

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

答案 3 :(得分:2)

您最好使用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),然后计算它们的数量以产生正确的输出。

答案 4 :(得分:1)

使用:

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

答案 5 :(得分:1)

你可以像这样编写你的作业:

<?php echo CHtml::activeTextArea($model,'adremarks', array("id" => "adremarks"));?>

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

如果要包含隐藏文件 这适用于所有类型的文件名,因为我们将count=$(ls -qA | grep -c '\.properties$') ls一起使用 当然,链接到一些告诉你“从不解析ls”的网页比阅读q手册更容易,并且看到有ls选项(并且大多数实现默认到q,如果输出到终端设备,这解释了为什么这里的某些人声明他们的q似乎通过用ls字符替换换行来处理带有换行符的文件名。< / p>

相关问题