Shell脚本:计算单个文件夹中特定类型扩展名中的文件数
我是新的shell脚本。 我需要使用shell脚本在变量中保存具有特定扩展名(.properties)的文件数 我用过Shell脚本:计算单个文件夹中特定类型扩展名中的文件数,shell,sh,ls,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
ls |grep .properties$ |wc -l
但此命令打印文件夹中属性文件的数量。如何在变量中指定此值
我试过了
count=${ls |grep .properties$ |wc -l}
但它显示的错误如下:
./replicate.sh: line 57: ${ls |grep .properties$ |wc -l}: bad substitution
- 这类错误是什么
- 请任何人帮助我将特定文件的数量保存在一个变量中,以备将来使用
count=`ls|grep .properties$ | wc -l`
echo $count
您使用了错误的括号,它应该是
$()
(命令输出替换),而不是${}
(变量替换)
您还会注意到,我使用了ls-1
强制每行一个文件,以防ls
不能自动为管道执行此操作,并更改了模式以正确匹配
如果您使用以下内容,也可以完全绕过grep
:
count=$(ls -1 *.properties 2>/dev/null | wc -l)
只需注意“邪恶”的文件名,例如那些带有嵌入换行符的文件名,尽管我的ls
似乎可以通过将换行符替换为?
字符来处理这些问题-这对于处理文件不一定是个好主意,但对它们进行计数也可以
如果你有这样的野兽并且你需要实际的文件名,那么有更好的工具可以使用,但是它们非常罕见,你通常不必担心它。你最好使用
find
而不是解析ls
。然后,使用var=$(命令)
语法存储该值
var=$(find . -maxdepth 1 -name "*\.properties" | wc -l)
参考文献:
要解决任何文件名包含新行时出现的问题,可以使用以下方法:
因此,对于每个匹配,它将打印的不是名称,而是任何随机字符(在本例中为
1
),然后计算它们的数量以产生正确的输出。您可以使用带全局搜索的循环:
count=0
for i in *.properties; do
count=$((count+1))
done
如果您使用的是支持数组的shell,则可以简单地捕获所有此类文件名
files=( *.properties )
然后确定数组元素的数量
count=${#files[@]}
(以上假设
bash
;其他shell可能需要稍微不同的语法。)您可以这样编写作业:
count=$(ls -q | grep -c '\.properties$')
或
如果要包括隐藏文件。这适用于所有类型的文件名,因为我们将
ls
与q
一起使用当然,与阅读
ls
手册并查看q
选项相比,链接到告诉您“永远不要解析ls”的网页更容易(如果输出到终端设备,大多数实现默认为q
,这解释了为什么这里的一些人说他们的ls
似乎可以通过用?
字符替换换行符来处理带有换行符的文件名)。结果显示为零。但实际结果是3:(它对我有效。您确定文件夹中有此扩展名的文件吗?这与ls*.properties
失败的原因相同;带换行符的文件名将占用多行。您至少需要使用类似-exec'echo 1'
的内容来代替默认的-print
,以确保单行每个文件的输出。它将是count=$#files
和z
shell。
count=${#files[@]}
count=$(ls -q | grep -c '\.properties$')
count=$(ls -qA | grep -c '\.properties$')