foo/bar
каталог (и у вас есть разрешение на поиск, foo
чтобы определить, что foo/bar
это каталог). В том случае, когда вы делаете:
ln -s new/target link
или
ln -fs new/target link
Это понимается как создание новой target
символической ссылки внутри link
каталога ( link
это каталог, потому что это символическая ссылка на foo/bar
каталог). Итак, вы на самом деле создадите:
foo/bar/target -> new/target
Чтобы преодолеть это, в GNU ln
есть -T
возможность, чтобы имя ссылки всегда рассматривалось как имя ссылки, а не как каталог для создания ссылки (ей). Итак, с GNU ln
:
ln -fsT new/target link
буду работать. Как и раньше, он удалит исходную link
символическую ссылку и создаст ее заново, new/target
указав в качестве цели (а также euid и egid процесса в качестве владельца).
У GNU ln
также есть -n
опция. Он работает так, -T
за исключением случаев, когда link
фактически является реальным каталогом, и в этом случае он все равно будет создавать символическую ссылку внутри этого каталога (вместо сбоя с ошибкой).
Как правило, лучше всего сначала удалить ссылку, а затем воссоздать ее:
rm -f link && ln -s new/target link