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 -l
opció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 saveino
y 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.c
y
funcionar findino
enhash.c
.
tree -l
recuerda 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