Se você quer apenas um único nível, então há um truque para fazer isso sem ter que enumerar o diretório. Se você quiser recursão, então o que você tem é o melhor que você vai conseguir.
O truque de um único nível:
stat --printf='%h\n' /path/to/dir
... e subtrai 2. O resultado é o número de diretórios dentro desse diretório (não recursivo).
Esse comando mostra o número de links físicos no arquivo especificado. Sempre que você criar um diretório dentro de um diretório, o subdiretório terá uma entrada de link físico para o diretório pai, o ..
. Então, criando um subdiretório, você aumenta o número de hard links para o diretório pai em um. Mas subtraímos 2 porque todo diretório começa com 2 hardlinks. Um hardlink está no diretório pai e aponta para ele: a entrada dir
dentro de /path/to
. O outro hardlink é o diretório que contém um link para si mesmo: a entrada .
.
No entanto, com recursão, você precisa examinar cada diretório. O problema é que não há como dizer "me dê uma lista de apenas diretórios dentro desse diretório". Você precisa obter uma lista de cada entrada no diretório e, em seguida, stat
cada uma para descobrir se é um diretório ou um arquivo.
Agora, quando você faz o stat directory, você pode usar o truque de hardlink acima para descobrir se o diretório contém algum subdiretório, e assim você pode economizar um pouco de tempo e não descer nesse diretório. O utilitário find
realmente usa esse truque para obter um pequeno ganho de desempenho no processo.
Então, basicamente, usar find
será o melhor que você pode fazer se quiser recursão.