Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell脚本:计算单个文件夹中特定类型扩展名中的文件数_Shell_Sh_Ls - Fatal编程技术网

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

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

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

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$')