Jak zastąpić symboliczny link do katalogu?

15

Istnieją dwa katalogi foo1i foo2.

Najpierw tworzę symlink katalogu za pomocą ln -s foo1 bar. Następnie chcę zmienić dowiązanie symboliczne, więc napisałemln -sf foo2 bar

Ale barnadal jest związany z foo1. Symlink foo2jest tworzony wewnątrz foo1.

Co mam wpisać, kiedy chcę zastąpić foo1przez foo2?

Testowałem w trzech środowiskach.

  1. Ubuntu 12.04, ln (GNU coreutils) 8.13
  2. CentOS 6.4, ln (GNU coreutils) 8.4
  3. OS X 10.7.5, ln (bez wersji)
żelazko piaskowe
źródło

Odpowiedzi:

18

Właściwym sposobem na to jest skorzystanie z takiej -n, --no-dereferenceopcji.

$ ln -snf foo2 bar

Powoduje lnto traktowanie istniejącego dowiązania symbolicznego jako pliku. W przeciwnym razie, to dereferences barsię foo1, popada foo1i wykorzystuje oryginalną TARGETnazwę jak LINK_NAMEi dlatego skończyć z linku do foo2tworzone wewnątrz foo1katalogu. Strona podręcznika zawiera lnnastępujące informacje ...

-n, - brak dereferencji
       traktuj LINK_NAME jak zwykły plik, jeśli jest to dowiązanie symboliczne do pliku
       informator

Poniżej znajduje się wynik powłoki na moim komputerze stacjonarnym Arch Linux z wersją 8.21 lnz --no-dereferenceopcją i bez , mam te same wyniki, co bez --no-dereferenceopcji, ale używając --no-dereferenceopcji działało zgodnie z oczekiwaniami.

$ mkdir foo1 foo2
$ ln -s foo1 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ln -sf foo2 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ls -l foo1
  total 0
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 foo2 -> foo2
$ ln -snf foo2 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:52 bar -> foo2
Drew Chapin
źródło
Dziękuję za odpowiedź. Jeśli jest to problem zależny od środowiska, napiszę moje środowisko. Z którego systemu operacyjnego korzystasz? jakie wyjścia ln --version?
ironsand
Próbowałem tego na maszynie wirtualnej Fedory 18 z wersją 8.17. Co ciekawe, wypróbowałem to na moim komputerze stacjonarnym Arch Linux z wersją 8.21 i uzyskałem te same wyniki, co ty. Wygląda na to, że gdzieś pomiędzy tymi dwiema wersjami coś się zmieniło. Rozwiązanie, które opublikowałem, działało jednak w obu przypadkach.
Drew Chapin
Do Twojej wiadomości znalazłem tę odpowiedź na forach justlinux.com .
Drew Chapin,
Dzięki druciferre! Nigdy nawet nie myślałem, że lnpolecenie tak często się aktualizuje.
ironsand
Testowałem również w osx. lndziała tak samo jak Ubuntu i Centos z nadpisaniem katalogu i ln -snfrozwiązuje problem. Mimo że ln -hjest preferowaną opcją do użycia w OSX.
ironsand