Почему команда дерева помечает символическую ссылку как рекурсивную?

245
KaHa

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

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

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

ln -s ~/test/aaa/bbb slink 

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

tree -l 

и посмотреть

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

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

2

1 ответ на вопрос

2
slhck

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

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

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

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

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

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

Да. Похоже, вы правы, даже если это крайне нелогично. Чтобы подтвердить это, я создал другое дерево: yyy / xxx / zzz плюс символическую ссылку "alink" и теперь: alink -> / home / kaa / test / yyy / xxx slink -> / home / kaa / test / aaa / bbb [рекурсивный , а не следуют] KaHa 6 лет назад 0

Похожие вопросы