Не удается перезаписать символическую ссылку RedHat Linux - PullRequest
38 голосов
/ 09 марта 2011

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

sudo ln -s /some/dir new_dir

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

sudo ln -f -s /other/dir new_dir

Я всегда могу sudo rm new_dir, но я бы предпочел, чтобы он перезаписал соответственно, если это возможно.Есть идеи?

Ответы [ 3 ]

61 голосов
/ 09 марта 2011
ln -sfn /other/dir new_dir

работает на меня. -n не разыменовывает символическую ссылку назначения.

9 голосов
/ 09 марта 2011

Вы можете создать его, а затем переместить:

sudo ln -f -s /other/dir __new_dir
sudo mv -Tf __new_dir new_dir

edit: отсутствует -Tf, чтобы рассматривать каталог как обычный файл и не запрашивать перезапись.

Таким образом, вы перезапишите его.

1 голос
/ 11 ноября 2015

Поскольку ссылка на комментарий от mikeytown2s не работает, я объясню, почему ответ redent84s лучше:

Пока

ln -sfn newDir currentDir

выполняет работу, это не атомарная операция , как вы можете видеть с помощью strace:

$ strace ln -snf newDir currentDir 2>&1 | grep link
unlink("currentDir")         = 0
symlink("newDir", "currentDir") = 0

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

Для предотвращения ошибок используйте вместо:

$ ln -s newDir tmpCurrentDir && mv -Tf tmpCurrentDir currentDir

Это создаст временную ссылку и после этого перезапишет currentDir в атомарной операции .

...