Jak zastąpić / zaktualizować dowiązanie symboliczne?

187

Próbuję użyć dowiązań symbolicznych. Przeczytałem i znalazłem następujące polecenia:

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}
Deletion -> rm {link-name}

Kreacje i usunięcia działają dobrze. Ale aktualizacje nie działają. Po wykonaniu tego polecenia dowiązanie symboliczne traci ważność.

Przeczytałem tu i tam, że nie można zaktualizować / zastąpić dowiązania symbolicznego. W sieci są więc sprzeczne informacje. Kto ma rację? Jeśli dowiązanie symboliczne może zostać zaktualizowane / zastąpione, jak mogę to osiągnąć?

Aktualizacja

Oto moja struktura katalogów:

~/scripts/test/
~/scripts/test/remote_loc/
~/scripts/test/remote_loc/site1/
~/scripts/test/remote_loc/site1/stuff1.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site2/stuff2.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site3/stuff3.txt

Od ~/scripts/test/kiedy wykonuję:

ln -s /remote_loc/site1 test_link

a test_linkjest tworzone i mogę ls -l, ale wydaje się, że jest zepsute (w przeciwieństwie do tego, co powiedziałem powyżej w moim pytaniu).

Jak mogę wykonać łącze na poziomie wielu katalogów?

Jérôme Verstrynge
źródło
1
Polecam używać unlinkzamiast rm. Dzięki temu unlinknigdy nie ryzykujesz utraty plików w katalogu źródłowym przez przypadkowe użycie niewłaściwych przełączników.
Jpsy,
Używasz wiodącego / w swoim poleceniu
Jamie Cook,
@jpsy twoja rada na temat odłączenia byłaby bardzo dobra, gdyby to była prawda . Spróbuj dotknąć zzzz; rozłącz zzzz. (rozłącz połączenia, rozłącz to samo co rm, ale bez wymyślnych opcji i bez rekurencji).
ctrl-alt-delor
Dlaczego warto korzystać -n? (może być problem). Również jeśli Twój ln obsługuje, -tużyj go, w tych przypadkach i -Tlub destination/w innych przypadkach.
ctrl-alt-delor

Odpowiedzi:

150

Używanie -fz lnspowoduje nadpisanie każdego linku, który już tam był, więc dopóki masz odpowiednie uprawnienia, powinno działać ... To zawsze działało dla mnie. Jakiego systemu operacyjnego używasz?

Sirch
źródło
Zaktualizowałem swoje pytanie o więcej informacji na temat mojego problemu.
Jérôme Verstrynge
Jestem pod linuksem.
Jérôme Verstrynge
2
Jeśli zmienisz lnparametry, co mam skłonność, czy -fprzełącznik zniszczy twoje istniejące pliki (cele docelowe)? W obu przypadkach mamy również -iparametr (który poprosi użytkownika o zastąpienie), jeśli chcesz trochę bezpieczeństwa.
palswim
2
@palswim Ten post SO sugeruje, że jest bezpieczny, ponieważ -ftylko połączenia unlink()i link()pod maską: stackoverflow.com/a/1466570/157385 . Chciałbym tylko zapamiętać prawidłową kolejność!
Mike Branski,
4
Nie działa. Potrzebuje -n. Zobacz zaakceptowaną odpowiedź.
Shawn Welch
118

Ok, znalazłem, gdzie jest mój błąd: nie należy stawiać pierwszego /na ścieżce.

Innymi słowy, polecenia w moich pytaniach powinny brzmieć:

Creation -> ln -s {path/to/file-name} {link-name}
Update -> ln -sfn {path/to/file-name} {link-name}

zamiast

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}

rozważając moją sprawę.

Jérôme Verstrynge
źródło
22
Aby uzyskać dodatkowe informacje, dlaczego tak jest, różnice są następujące: relativeścieżka (bez wiodącego /), a druga to absoluteścieżka (z wiodącym /). Jeśli administrujesz systemem Linux, KRYTYCZNE jest zrozumienie różnic. Na przykład różnica między rm -rf ./*i rm -rf /.*decyduje, czy pozostaniesz w pracy, czy nie :)
Safado
5
To nie odpowiada na pytanie „jak zaktualizować / pominąć link sym”
Sirch
Wiersz ln -sfn {ścieżka / do / nazwa-pliku} {nazwa-łącza} tak.
Jérôme Verstrynge
6
-n (--no-dereference) powoduje, że traktuje {nazwa łącza} jak zwykły plik zamiast podążania za linkiem. Ponieważ musisz operować na tym linku, a nie podążać za nim, musisz użyć tej opcji.
feldoh
1
Ta odpowiedź powinna być podświetloną odpowiedzią z -nparametrem zastępującym łącze symboliczne.
Nick Tsai,
12

Pierwsza sprawa:

Cytując cię:

Kreacje i usunięcia działają dobrze. Ale aktualizacje nie działają. Po wykonaniu tego polecenia dowiązanie symboliczne traci ważność.

Problem z podaną strukturą katalogów:

~ / scripts / test / ~ / scripts / test / remote_loc / ~ / scripts / test / remote_loc / site1 / ~ / scripts / test / remote_loc / site1 / stuff1.txt ~ / scripts / test / remote_loc / site2 / ~ / scripts /test/remote_loc/site2/stuff2.txt ~ / scripts / test / remote_loc / site2 / ~ / scripts / test / remote_loc / site3 / stuff3.txt

i za pomocą polecenia:

ln -s /remote_loc/site1 test_link

Czy tworzy symboliczne łącze w twoim $ PWD lub obecnym katalogu roboczym, który wskazuje na nieistniejący plik poza / lub rootem w / remote_loc / site1

Jeśli twoje PWD jest w ~ / scripts /, powinieneś był użyć tego:

ln -s remote_loc/site1 test_link

w przeciwnym razie mógłbyś użyć pełnej ścieżki bezwzględnej, takiej jak:

ln -s /home/yourusername/remote_loc/site1 test_link

Drugi numer:

Cytując cię:

Przeczytałem tu i tam, że nie można zaktualizować / zastąpić dowiązania symbolicznego. W sieci są więc sprzeczne informacje. Kto ma rację? Jeśli dowiązanie symboliczne może zostać zaktualizowane / zastąpione, jak mogę to osiągnąć?

Odpowiadając na pytanie „Kto ma rację”, nie jestem pewien, co dokładnie przeczytałeś ani jak to zrozumiano. Ale następujące powinny pomóc wyjaśnić:

  1. Co można zaktualizować, i
  2. Czego nie można zaktualizować bez użycia odpowiednich przełączników.


Aktualizowanie dowiązań symbolicznych do celów, które nie są katalogami.

ln -sf:
-f lub --force usuwa istniejące pliki docelowe, służy do aktualizacji celu lub miejsca docelowego łącza.

Przykład:

 ln -sf /tmp/test /tmp/test.link; ls -go /tmp |grep test
 -rw-r--r-- 1    0 Jun  8 17:19 test
 lrwxrwxrwx 1    9 Jun  8 17:27 test.link -> /tmp/test

Ale, jak widać, poda ścieżkę bezwzględną, jeśli lnargumentami są ścieżki bezwzględne . Podanie pełnej ścieżki jest konieczne, gdy obecny katalog roboczy jest inny niż katalog macierzysty łącza.


Ścieżki względne:

ln -sfr:
-r lub --relative tworzy dowiązania symboliczne względem lokalizacji łącza.

Przykład:

ln -sfr /tmp/test  /tmp/test.link  ; ls -go /tmp| grep test
-rw-r--r-- 1    0 Jun  8 17:19 test
lrwxrwxrwx 1    4 Jun  8 17:27 test.link -> test

Jednak aktualizacja łącza do katalogu nie będzie działać, jeśli celem jest katalog.

Przykład:

ln -sf /tmp/testdir  /tmp/testdir.link  ; ls -go /tmp  |grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:47 testdir.link -> testdir

Jak widać, pomimo użycia bezwzględnych nazw ścieżek podanych w lnpowyższym argumencie bez opcji -r, dowiązanie symboliczne jest nadal względne względem dowiązania.


Zaktualizuj łącza do katalogów:

ln -sfrn:
-n lub --no-dereference traktuje LINK_NAME jako normalny plik, jeśli jest dowiązaniem symbolicznym do katalogu.

Przykład:

ln -sfn /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1   12 Jun  8 17:48 testdir.link -> /tmp/testdir

W przeciwieństwie do:

ln -sfnr /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:48 testdir.link -> testdir
Keith Reynolds
źródło
6
$ touch test1 test2
$ ln -sf test2 test1
$ ls -l test[12]
lrwxrwxrwx 1 user01 user01 5 2012-05-17 14:41 test1 -> test2
-rw-r--r-- 1 user01 user01 0 2012-05-17 14:41 test2
jirib
źródło
Kiedy wykonuję testy z 1 poziomem katalogu, działa, ale próbuję użyć katalogów wielopoziomowych i nie działa. Zaktualizowałem swoje pytanie.
Jérôme Verstrynge