jak zaktualizować symboliczny cel dowiązania (ln -f -s nie działa)

45

używam

ln -f -s / var / www / html / releases / build1390 app-current

zaktualizować link symboliczny „bieżąca aplikacja” o nowy cel. Jednak to nie działa, link „bieżąca aplikacja” zachowuje oryginalne miejsce docelowe, jednak nie otrzymuję żadnych błędów ...

Wolałbym nie usuwać łącza i odtwarzać go ponownie, wystarczy zaktualizować cel istniejącego łącza. Czy to jest możliwe?

solsol
źródło

Odpowiedzi:

55

To działa dla mnie, jaka jest wydajność strace ln -f -s /var/www/html/releases/build1390 app-current?

Och, ponieważ jest to katalog, który należy dodać, -naby nie było dereferencji, a to powinno rozwiązać problem. -fjest naprawdę wygodniejsze, ponieważ dodanie -f powoduje, że i tak się rozłącza. Chociaż myślę, że prawdopodobnie normalnie byłoby to kilkaset ms szybciej.

Na przykład, jeśli arf już wskazuje na / home:

strace With -n:

strace ln -n -f -s / arf
...
symlink("/", "arf")           = -1 EEXIST (File exists)
unlink("arf")                           = 0
symlink("/", "arf")           = 0

strace Bez -n:

strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: )                  = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1)                    = 1

Więc bez -narfa zostaje zdereferencjonowany, więc traktuję go jak arf, jakby to było rzeczywiście /. W twoim konkretnym przykładzie, jeśli nie ma błędu, myślę, że prawdopodobnie utworzyłeś nowe łącze symboliczne /var/www/html/releases/build1390 app-currenti będziesz chciał to wyczyścić.

Kyle Brandt
źródło
4
świetnie, to -n to zrobiło. Wielkie dzięki!
solsol
12

Możesz użyć -nlub, --no-dereferenceaby zapobiec dereferencji celu, jeśli jest to dowiązanie symboliczne. Możesz także użyć -Tlub, --no-target-directoryaby zapewnić, że plik docelowy będzie zawsze traktowany jako zwykły plik.

Powodują one nieco inne zachowanie, jak pokazuje poniższy przykład. Załóżmy, że srcjest jakiś plik, dirlinkjest dowiązaniem symbolicznym do katalogu i dirjest rzeczywistym katalogiem.

Używanie -n:

  • ln -sfn src dirlinknadpisuje dirlinki łączy go zsrc
  • ln -sfn src dir tworzy link dir/src -> src

Używanie -T:

  • ln -sfT src dirlinknadpisuje dirlinki łączy go zsrc
  • ln -sfT src dir wyświetla komunikat o błędzie: ln: ‘dir’: cannot overwrite directory
augurar
źródło
1
ma najbardziej poprawną i zwięzłą odpowiedź dla użytkowników Linuksa.
Ross
Czy istnieje sposób wymuszenia zastąpienia katalogu docelowego, aby nie wyświetlał się komunikat o błędzie cannot overwrite directory?
gitaarik
@rednaw Możesz to zrobić, łącząc kilka poleceń, ale lnsam nie usuwa katalogów - prawdopodobnie byłby to zły pomysł, ponieważ wymagałby rekurencyjnego usuwania prawdopodobnie dużej liczby plików.
sierpnia