Czy istnieje sposób na edycję dowiązania symbolicznego bez jego wcześniejszego usunięcia? [duplikat]

To pytanie ma już odpowiedź tutaj:

Więc utworzyłem dowiązanie symboliczne:

ln -s /location/to/link linkname

Teraz chcę zmienić lokalizację, do której łączy się dowiązanie symboliczne. Jak mam to zrobić? czy istnieje sposób, aby to zrobić bez usuwania go najpierw?

Author: Andrew, 2009-11-13

10 answers

Możesz utworzyć nowy link o innej nazwie, a następnie przenieść go, aby zastąpić stary link.

ln -s /location/to/link linkname

Później

ln -s /location/to/link2 newlink
mv newlink linkname

Jeśli newlink i linkname znajdują się na tym samym urządzeniu fizycznym, mv powinny być atomowe.

 34
Author: martin clayton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-13 07:01:03

Spróbuj ln -sf new_destination linkname.

 22
Author: Phil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-13 05:33:46

Jeśli obiektami docelowymi dowiązań symbolicznych są katalogi, musisz dodać flagę -T do polecenia mv, w przeciwnym razie przeniesie on nowy dowiązanie symboliczne do katalogu docelowego starego dowiązania symbolicznego.

Przykład atomicznego przełączania strony internetowej na nową wersję:

Strona jest przechowywana w katalogu www1, vhost wskazuje na www symlink:
ln -s www1 www

Przejdź do strony internetowej, zobacz starą wersję.

Umieść nowe pliki strony w nowym katalogu www2.

Ustawianie nowego dowiązania symbolicznego do nowej strony:

ln -s www_new www2

Przenieś www symlink do katalogu nowej strony:

mv -T www_new www

Przejdź do strony internetowej, natychmiast zobacz nową wersję.

 16
Author: ben_nuttall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-26 17:44:00

Po prostu zmień cel dowiązania symbolicznego:

# ln -sfT /path/to/new/target linkname

To jest natychmiastowa, atomowa zmiana.
 9
Author: Jake Wilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-18 05:08:34

Dla katalogów, chcesz zrobić: ln - SFT / location/to / new / target old_linkname

 7
Author: raa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-02 21:48:04

Na OSX, strona podręcznika dla ln mówi, że możesz to zrobić w ten sposób

ln -shf /location/to/link link name

Ze strony man:

The options are as follows:
 -F    If the target file already exists and is a directory, then remove it so that the link may occur.  The -F
       option should be used with either -f or -i options.  If none is specified, -f is implied.  The -F option is
       a no-op unless -s option is specified.

 -h    If the target_file or target_dir is a symbolic link, do not follow it.  This is most useful with the -f
       option, to replace a symlink which may point to a directory.

 -f    If the target file already exists, then unlink it so that the link may occur.  (The -f option overrides any
       previous -i options.)

 -i    Cause ln to write a prompt to standard error if the target file exists.  If the response from the standard
       input begins with the character `y' or `Y', then unlink the target file so that the link may occur.  Other-
       wise, do not attempt the link.  (The -i option overrides any previous -f options.)

 -n    Same as -h, for compatibility with other ln implementations.

 -s    Create a symbolic link.

 -v    Cause ln to be verbose, showing files as they are processed.
 6
Author: jschank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-17 21:30:05

Nie. Wywołanie systemowe symlink zwróci EEXIST jeśli newpath już istnieje. Możesz łączyć się tylko z nowego węzła w systemie plików. Jakie są wymagania? Jeśli martwisz się o wyścig z powodu braku atomiczności wywołań unlink/symlink, możesz przemyśleć trochę architekturę, aby zapewnić synchronizację w innym miejscu. Pojawiły się straszne błędy bezpieczeństwa wprowadzone przez tego rodzaju rzeczy.

 5
Author: Andy Ross,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-13 05:33:19

Łańcuch poleceń w ten sposób:

rm currentlink && ln -s /path/to/link currentlink

Pierwsze polecenie usuwa istniejące, a drugie natychmiast tworzy je ponownie.

 4
Author: Pete,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-26 09:20:10

Jak już wspominali inni, w zasadzie musisz najpierw usunąć dowiązanie symboliczne, ręcznie lub przekazując flagę -f do Narzędzia ln.

Lata temu musiałem dość często wprowadzać małe zmiany do dowiązań symbolicznych, więc napisałem proste narzędzie oparte na readline (edln), aby to mniej irytujące. Jeśli ktoś jeszcze uzna to za przydatne, umieściłem go w internecie na https://github.com/jjlin/edln/.

edln wyświetli oryginalny cel dowiązania symbolicznego; można następnie użyć strzałki klawisze lub standardowe naciśnięcia klawiszy readline(M-b, M-f, C-d, itd.), aby poruszać się i edytować cel.

 3
Author: jjlin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-07 00:46:10

Po prostu wygooglowałem, nie znalazłem dobrej odpowiedzi i musiałem rozwiązać Sam:

ln -f -s -T `readlink SomeLibrary | sed 's/version.old/version.new/'` SomeLibrary

Edycja z definicji nie oznacza odtworzenia od zera, ale częściowej zmiany. Każda odpowiedź wymagająca zapamiętania ścieżki, może długa lub z dziwnymi symbolami, jest zdecydowanie zła.

 0
Author: user1046885,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-29 11:32:38