如何在bash中获取给定目录的目录数?

时间:2018-09-03 20:38:00

标签: bash count directory

我正在尝试使用ls和grep获取目录计数,并将值存储在变量中。不幸的是,我收到此错误:./test.sh: line 3: -l: command not found 这是脚本:

#!/bin/bash

assetid=ls -l /home/user/Desktop/folder | grep -c "^d"

echo $assetid

3 个答案:

答案 0 :(得分:2)

使用循环来显式计数由模式产生的每个项目。

count=0
for f in /home/user/Desktop/folder/*/; do
    count=$((count + 1))
done

如果您还需要包括隐藏目录,请使用

count=0
for f in /home/user/Desktop/folder/*/ /home/user/Desktop/folder/.*/; do
    count=$((count + 1))
done

如果您不关心内存使用情况,请填写一个数组并获取结果数组的大小

dirs=( /home/user/Desktop/folder/*/ )
count=${#dirs[@]}

答案 1 :(得分:1)

有时SO格式已关闭,但您是否真的要运行命令assetid=ls -l /home/user/Desktop/folder | grep -c "^d"

如果是,则尝试在环境变量-l设置为字符串assetid的情况下运行命令ls。您可能打算这样做

assetid=$( ls -l /home/user/Desktop/folder | grep -c "^d" )

答案 2 :(得分:1)

我想这将处理所有情况:

find . -maxdepth 1 -type d -exec echo \; | wc -l

对于每个目录,我打印一个空的换行符...然后计算换行符。遗憾的是wc不适用于以null结尾的字符串,但是我们可以删除除零以外的所有字符并对它们进行计数:

find . -maxdepth 1 -type d -print0 | tr -cd '\0' | wc -c

关于脚本,您会遇到错误,因为如果要将输出保存到变量中,则需要在$( .. )中加上注释。 Bash知道空间,我的意思是a=1是角色,a = 1是名为a的运行程序,带有参数=1。 Bash解释以下行:var=1 bash -c 'echo $var',因为它首先设置var=1,然后运行带有参数bash-c的程序'echo $var'。试试这个:

assetid=$(ls -l /home/user/Desktop/folder | grep -c "^d")

但是不要解析ls输出。 ls用于人类可读的彩色输出,最好在批处理/管道脚本中使用不同的实用程序。