Как заставить создать символическую ссылку?

У меня есть конкретный каталог, полный других каталогов, организованных (по имени) по дате. Для удобства ссылок у меня есть символическая ссылка, которая называется current указывающая на последнюю.

В скрипте, который создает новые каталоги дат, я хочу создать или исправить current символическую ссылку, чтобы указать на новейший каталог после создания.

Я думал, что соответствующая команда будет просто, например,

 ln -fs 2017-03-01 current 

Если current символическая ссылка еще не существует, это работает.


Однако, если current символическая ссылка уже создана (и указывает, скажем, в каталоге 2017-02-28 ), это не работает:

Вместо того, чтобы удалить current symlink и создать новый current 2017-03-01 , который указывает на 2017-03-01 , результатом будет вместо этого сломанная символическая ссылка, называемая 2017-03-01 указывающая на себя, покоящаяся в каталоге 2017-02-28 (который где current символьной ссылки указывает и все еще указывает).

Это меня озадачило, поэтому я прочитал спецификации для ln . Оказывается, это ожидаемое поведение:

СИНТАКСИС

 ln [-fs] [-L|-P] source_file target_file ln [-fs] [-L|-P] source_file... target_dir 

ОПИСАНИЕ

Вторая форма синопсиса должна приниматься, когда конечный операнд называет существующий каталог.


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

Должен ли я rm current , или есть другой подход, который я забыл?

В GNU ln существует ln -n , что позволило бы повторно указать символическую ссылку:

 $ mkdir dir1 dir2 $ ln -s dir1 sym # dir1/ # dir2/ # sym -> dir1/ $ ln -nsf dir2 sym # dir1/ # dir2/ # sym -> dir2/ 

BSD coreutils использует флаг -h же, как и использовать -n , но, скорее всего, двоичный файл может поддерживать -n только для совместимости с GNU .