2

У меня есть следующее дерево каталогов:

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

И создайте символическую ссылку:

ln -s ~/test/aaa/bbb slink

После этого я запускаю команду дерева:

tree -l

и посмотреть

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

Почему слинк помечен как рекурсивный? Это ошибка или я что-то недопонимаю?

1 ответ1

2

Вы использовали опцию -l :

Переходит по символическим ссылкам, если они указывают на каталоги, как если бы они были каталогами. Символьные ссылки, которые приведут к рекурсии, избегаются при обнаружении.

Теперь, причина, по которой оно печатает это предупреждение, не в том, что оно на самом деле повторяется. Мы ясно видим, что он просто снова перечислит дерево bbb/ccc .

Я предполагаю, что настоящая проблема - это проблема остановки: команда tree не может знать, будет ли она бесконечно повторяться, и поэтому она должна прекратить уже, когда обнаруживает символическую ссылку на каталог, который она уже посетила - даже если после этого каталог будет просто печатать поддерево, а не рекурсивно.

Даже если вы можете остановить рано или после заранее определенного числа рекурсий, все это делается для того, чтобы не использовать бесконечные объемы памяти. По крайней мере, это моя интерпретация.

Соответствующий код здесь, кстати. Если номер индекса каталога, на который указывает символическая ссылка, найден в хеш-таблице (которая заполняется с помощью saveino и findino), он просто пропустит ее.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .