¿Por qué el comando de árbol marca el enlace simbólico como recursivo?

¿Por qué el comando de árbol marca el enlace simbólico como recursivo?

Tengo el siguiente árbol de directorios:

.
└── aaa
    └── bbb
        └── ccc

Y crea un enlace simbólico:

ln -s ~/test/aaa/bbb slink

Después de esto ejecuto el comando de árbol:

tree -l

y ver

.
├── aaa
│   └── bbb
│       └── ccc
└── slink -> /home/kaa/test/aaa/bbb  [recursive, not followed]

¿Por qué slink está marcado como recursivo? ¿Es un error o estoy entendiendo mal algo?

Respuesta1

Usaste la -lopción:

Sigue enlaces simbólicos si apuntan a directorios, como si fueran directorios. Los enlaces simbólicos que resultarán en recursividad se evitan cuando se detectan.

Ahora, la razón por la que imprime esta advertencia no es que lo haríade hechorecursivo. Podemos ver claramente que simplemente volvería a incluir el bbb/cccárbol en la lista.

El código respectivo esaquí, por cierto. Si el número de inodo del directorio al que apunta el enlace simbólico se encuentra en la tabla hash (la que está completa con saveinoy findino), simplemente lo omitirá.

Respuesta2

Creo que la documentación es imprecisa. La documentación dice

Enlaces simbólicos que darán como resultadorecursividadse evitan cuando se detectan

pero debería decir algo como

Enlaces simbólicos que darán como resultadoun directorio ya visitadono son seguidos

Verubicación del mensaje de error entree.cy funcionar findinoenhash.c.

tree -lrecuerda los directorios visitados y solo desciende aEnlacescuyo destino aún no ha sido visitado:

( mkdir test1 && cd test1 && mkdir -p a/b && ln -s a link && tree -l; )
.
├── a
│   └── b
└── link -> a  [recursive, not followed]

Tenga en cuenta que ignorar directorios ya visitados sólo se realiza paraEnlaces.RealLos directorios siempre se visitan. Esto significa queel orden de los asuntos transversales. Atravesar exactamente el mismo árbol en orden alfabético inverso ( -r) sigue el enlace, porque visita el enlace en un momento en el que su objetivo aún no está visitado.

( cd test1 && tree -r -l; )
.
├── link -> a
│   └── b
└── a
    └── b

Aquí hay dos alternativas más para reproducir este comportamiento:

Ignorar ( -I) directorio a/, para que no sea visitado al visitar el enlace:

( cd test1 && tree -l -I a; )
.
└── link -> a
    └── b

Asigne un nombre a los directorios y al enlace, de modo que el enlace se visite primero de forma natural:

( mkdir test2 && cd test2 && mkdir -p x/y && ln -s x link && tree -l; )
.
├── link -> x
│   └── y
└── x
    └── y

información relacionada