Nie można zmienić miejsca docelowego łącza symbolicznego

21

Chcę zmienić miejsce docelowe istniejącego łącza symbolicznego, bez usuwania łącza lub starego miejsca docelowego.

Wcześniej utworzyłem symboliczne łącze do katalogu, takie jak:

$ cd /usr/lib/jvm/

$ ls -lh
drwxr-xr-x 8 uucp  143 4.0K Sep 10 20:22  jdk1.7.0_04
drwxr-xr-x 8 uucp  143 4.0K Aug 29 05:42  jdk1.7.0_07

$ sudo ln -s jdk1.7.0_04 oracle-jdk-7

$ ls -lh
drwxr-xr-x 8 uucp  143 4.0K Sep 10 20:22  jdk1.7.0_04
drwxr-xr-x 8 uucp  143 4.0K Aug 29 05:42  jdk1.7.0_07
lrwxrwxrwx 1 root root   12 May 11 11:27  oracle-jdk-7 -> jdk1.7.0_04/

Teraz chcę to zmienić, aby przejść do innego katalogu:

$ sudo ln --force -s jdk1.7.0_07 oracle-jdk-7

Ale to nie działa bez żadnych błędów:

$ ls -lh
drwxr-xr-x 8 uucp  143 4.0K Sep 10 20:36  jdk1.7.0_04
drwxr-xr-x 8 uucp  143 4.0K Aug 29 05:42  jdk1.7.0_07
lrwxrwxrwx 1 root root   12 May 11 11:27  oracle-jdk-7 -> jdk1.7.0_04/

Jakaś pomoc ?

Seyed Mohammad
źródło
Może to mały szczegół, ale wygląda na to, że faktycznie wykonałeś polecenie sudo ln -s jdk1.7.0_04/ oracle-jdk-7. Zwróć uwagę na slash po 04.
wjandrea

Odpowiedzi:

31

Aby utworzyć symboliczne łącze do katalogu , użyj opcji „n”:

ln -sfn DESTINATION_DIRECTORY LINK_NAME
  • DESTINATION_DIRECTORY to nazwa celu linku;
  • LINK_NAME to nazwa linku.
  • fOpcja oznacza zastąpienie istniejącego łącza (czyli usunąć go wcześniej).

Ta nopcja jest nieco skomplikowana. Wydaje mi się, że twoje polecenie mogło utworzyć link do jdk1.7.0_07katalogu jdk1.7.0_04, za pośrednictwem linku oracle-jdk-7zamiast go zastępować. Jeśli tak, należy usunąć link, aby uniknąć nieporozumień.

Marty Fried
źródło
Możesz także użyć opcji T, tj.ln -sfT TARGET LINK_NAME
wjandrea