7
# ln -sv /path/to/target /path/to/link
‘/path/to/link’ -> ‘/path/to/target’

Теперь я хочу заменить эту цель на target2:

# ln -sfv /path/to/target2 /path/to/link
‘/path/to/link/target2’ -> ‘/path/to/target2’

Вау! Что там произошло? Конечные косые черты не имеют никакого эффекта:

ln -sfv /path/to/target2/ /path/to/link
‘/path/to/link/target2’ -> ‘/path/to/target2/’

# ln -sfv /path/to/target2/ /path/to/link/
‘/path/to/link/target2’ -> ‘/path/to/target2/’

# ln -sfv /path/to/target2 /path/to/link/
‘/path/to/link/target2’ -> ‘/path/to/target2’

Как добиться ’/path/to/link’ -> ’/path/to/target2’ ?

2 ответа2

12

Используйте -n/--no-dereference («рассматривать LINK_NAME как обычный файл, если это символическая ссылка на каталог»):

$ ln -sv /var/log /tmp/my-link
‘/tmp/my-link’ -> ‘/var/log’
$ ln -sfnv /var/opt /tmp/my-link
‘/tmp/my-link’ -> ‘/var/opt’

То есть ln -s target link будет работать как ln -s target link/target если link ссылается на каталог.

Большинство командных инструментов Linux будут пытаться разыменовать символические ссылки перед применением своих действий, в противном случае символические ссылки будут в основном просто запутанными и почти бесполезными. Я предполагаю , что первоначальные авторы ln думал консистенция была более важна , чем определенное количество простоты (с риском быть запутанным для людей , привыкших к другим инструментам) в этом случае.

2

Ответ l0b0 хороший. Это просто, и это делает его лучшим для использования командной строки большую часть времени. Однако в некоторых случаях вам может показаться, что это не атомарно. ln -sf сначала удаляет старую символическую ссылку, затем создает новую, поэтому существует короткий период, когда символическая ссылка не существует.

Если нужно быть осторожным, лучше создать новую символическую ссылку во временном месте, а затем mv ее на место.

Здесь есть рубиновая реализация: http://blog.moertel.com/posts/2005-08-22-how-to-change-symlinks-atomically.html. Это было бы легко реализовать на любом языке. Бьет меня, почему это не стандартное поведение ln.

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