Por lo general, es cierto en sistemas Unix que el número de enlaces a un directorio es el número de subdirectorios más 2. Sin embargo, hay casos en los que esto no es cierto:
Algunas unidades permiten enlaces duros a directorios. Luego habrá más de 2 enlaces que no corresponden a subdirectorios.
Hay sistemas de archivos donde los directorios no tienen entradas para .
y ..
. El manual de búsqueda de GNU menciona algunos ejemplos en la discusión de su -noleaf
opción (que deshabilita una optimización que asume eso .
y ..
existe en todos los directorios): "CD-ROM o sistemas de archivos MS-DOS o puntos de montaje de volumen AFS"
Una forma casi confiable de contar el número de subdirectorios (aún puede fallar si un nombre de archivo contiene un carácter de nueva línea) es
$(($(LC_ALL=C ls -la /path/to/directory | grep '^d' | wc -l) - 2)
Una forma más confiable utiliza globos de concha */
y .*/
; como de costumbre, manejar el caso donde el patrón no coincide es un poco molesto (excepto en bash y zsh donde puede activar la nullglob
opción).
Gilles 'SO- deja de ser malvado'
fuente
-type d
, pero: 1. esto requiere GNU find; 2. necesita restar 1 para el directorio de inicio (o pasar-mindepth 1
).No lo uses
ls
para esto . Aquí hay una forma que funciona con todos los nombres de archivo, incluso aquellos que contienen líneas nuevas, porque imprime solo un carácter de línea nueva en lugar del nombre de archivo:Editar: La versión actual no da lugar a ninguna advertencia, debido
-mindepth
y-maxdepth
debe ser antes-type
(el árbol de directorios se poda antes de comprobar si los directorios, para ahorrar tiempo).fuente