Se você colocar um /
no final de um padrão curinga, o padrão corresponderá apenas aos diretórios e links simbólicos para os diretórios. O snippet a seguir, portanto, conta diretórios e links simbólicos no diretório atual.
set -- */ .*/
if ! [ -e "$1" ]; then shift; fi # handle the case when */ matches nothing
echo $(($# - 2)) # -2 for . and ..
No bash, você pode simplificar isso para
shopt -s dotglob nullglob
dirs=(*/)
echo ${#dirs[@]}
Se você não quiser incluir diretórios, use find
. Se nenhum dos diretórios tiver um nome que contenha uma nova linha, você poderá contar as linhas:
find . -name . -o -type d -print -prune | wc -l
Para ser totalmente robusto, conte as barras.
find . -name . -o -type d -print -prune | tr -dc / | wc -c