У меня есть следующее дерево каталогов:
.
└── aaa
└── bbb
└── ccc
И создайте символическую ссылку:
ln -s ~/test/aaa/bbb slink
После этого я запускаю команду tree:
tree -l
и посмотреть
.
├── aaa
│ └── bbb
│ └── ccc
└── slink -> /home/kaa/test/aaa/bbb [recursive, not followed]
Почему slink помечен как рекурсивный? Это баг или я что-то не понимаю?
решение1
Вы использовали -l
опцию:
Следует символическим ссылкам, если они указывают на каталоги, как если бы они были каталогами. Символические ссылки, которые приведут к рекурсии, избегаются при обнаружении.
Итак, причина, по которой он печатает это предупреждение, заключается не в том, что онна самом делеrecurse. Мы ясно видим, что это просто перечислит bbb/ccc
дерево еще раз.
Соответствующий код:здесь, кстати. Если номер инода каталога, на который указывает символическая ссылка, найден в хэш-таблице (той, которая заполнена saveino
и findino
), он просто пропустит его.
решение2
Я думаю, что документация неточная. В документации говорится:
Символические ссылки, которые приведут крекурсияизбегаются при обнаружении
но это должно быть что-то вроде
Символические ссылки, которые приведут куже посещенный каталогне соблюдаются
Видетьрасположение сообщения об ошибке вtree.c
и
функция findino
вhash.c
.
tree -l
запоминает посещенные каталоги и переходит только вссылкицель которого еще не была посещена:
( mkdir test1 && cd test1 && mkdir -p a/b && ln -s a link && tree -l; )
.
├── a
│ └── b
└── link -> a [recursive, not followed]
Обратите внимание, что игнорирование уже посещенных каталогов выполняется только дляссылки.Настоящийкаталоги всегда посещаются. Это означает, чтопорядок обхода имеет значение. Обход точно такого же дерева в обратном алфавитном порядке ( -r
) следует по ссылке, поскольку он посещает ссылку в то время, когда ее цель еще не посещена.
( cd test1 && tree -r -l; )
.
├── link -> a
│ └── b
└── a
└── b
Вот еще два варианта воспроизведения этого поведения:
Игнорировать ( -I
) каталог a/
, чтобы он не посещался при посещении ссылки:
( cd test1 && tree -l -I a; )
.
└── link -> a
└── b
Назовите каталоги и ссылку так, чтобы ссылка естественным образом посещалась первой:
( mkdir test2 && cd test2 && mkdir -p x/y && ln -s x link && tree -l; )
.
├── link -> x
│ └── y
└── x
└── y