Jak utworzyć względne dowiązanie symboliczne w systemie Linux?

62

Potrzebuję dowiązania symbolicznego, które rozpoznaje w stosunku do katalogu, w którym się znajduje. Jakie polecenie służy do stworzenia takiej rzeczy?

Jeremiasz Rose
źródło

Odpowiedzi:

78
  1. Przejdź do katalogu, w którym link ma się znajdować
  2. Uruchom polecenie ln -s ../some/other/file linkname

Podana ścieżka jest przechowywana w pliku. Podczas uzyskiwania dostępu do pliku zapisana ścieżka jest wyszukiwana i rozwijana względem pliku. Nie wie, w jakim katalogu byłeś podczas tworzenia linku.

Jeremiasz Rose
źródło
23
Nie ty nie. Musisz tylko upewnić się, że podasz lokalizację względem nazwy łącza zamiast bieżącego katalogu.
Ignacio Vazquez-Abrams
5
Aby pomóc w zrozumieniu: Podana ścieżka jest przechowywana w pliku. Podczas uzyskiwania dostępu do pliku zapisana ścieżka jest wyszukiwana i rozwijana względem pliku. Nie wie, w jakim katalogu byłeś podczas tworzenia linku.
Marian
2
dokładnie równoważny:ln -s ../some/other/file /some/dir/linkname
patrz
1
Zamiast schodzić w dół katalogu i ponownie w górę, możesz również zrobić, ln -s ./file linknameponieważ .odnosi się do bieżącego katalogu.
pduersteler
1
ln -s somedir/original-dir link-namenie działa. Tworzy katalog o nazwie link-namezawierającej niepoprawny link. Polecenie, które działa, toln -sr somedir/original-dir link-name
Lorenz Meyer
28

Najnowsze wersje GNU coreutils 'ln (> = 8.16) obsługują opcję --relative(lub -r), co oznacza, że ​​możesz wywoływać ln -s2 ścieżkami bezwzględnymi lub względnymi (w odniesieniu do katalogu roboczego) i obliczy poprawną ścieżkę względną, która musi być napisane do dowiązania symbolicznego.

Bluewind
źródło
2
Dzięki. Ta -ropcja jest przydatna, gdy kompilujesz się między sobą i potrzebujesz bezwzględnych ścieżek na hoście kompilacji, ale ścieżek względnych na celu.
Robert Calhoun,
rdfind może produkować naprawdę złe linki symboliczne, które są nie tylko absolutne, ale wycofują się z katalogów bez powodu. ln -r -s targetfile myaliasmoże pomóc to naprawić
Ray Foss
2

To, co musisz zrozumieć, to w zasadzie to, że dowiązanie symboliczne bardziej przypomina plik tekstowy niż pozycję katalogu, która zawiera plik. Więc jeśli ty

echo ../poo >/file/name

to jest całkiem podobne do

ln -s ../poo /file/name

System nie dba o to, czy /file/../poow ogóle istnieje, to tylko fragment tekstu, który zostaje umieszczony w dowiązaniu symbolicznym. Kiedy coś próbuje otworzyć dowiązanie symboliczne, wtedy system próbuje to rozwiązać.

Jeśli używasz powłoki z uzupełnianiem nazw plików, ta funkcja może wprowadzać w błąd, umożliwiając uzupełnienie nazwy pliku względem bieżącego katalogu roboczego, nawet jeśli ostatecznie użyjesz go jako celu dowiązania symbolicznego w zupełnie innym katalogu.

potrójny
źródło
To jest nadużywane przez niektóre wywołań systemowych - znam np BSD używane do pozwalają podlinkowujemy konkretny plik systemowy do <zmiany jak system przydzielona pamięć. Oczywiście <w tym katalogu nie ma nazwy pliku , jest to po prostu tani sposób na stworzenie bardzo małej, podobnej do pliku rzeczy, która ma pewne atrakcyjne właściwości w stosunku do zwykłego pliku tekstowego na tej konkretnej platformie.
tripleee
Ten link jest teraz martwy. Spróbuj man.openbsd.org/OpenBSD-5.3/man5/malloc.conf.5, ale zauważ również, że zachowanie w nowszych wersjach OpenBSD jest o wiele mniej ... kolorowe.
tripleee
0

Względne linki były dla mnie trudne w OS X, tj

~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin ~/bin
~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin/ ~/bin

oba nie działały (coś zostało utworzone, ale to nie był katalog). Utworzyłem pożądany link za pomocą ścieżek bezwzględnych .

~/Dropbox/git/dave-bot $ ln -s ~/Dropbox/git/codyhess/bin/ ~/bin
Cody Hess
źródło
To realne rozwiązanie, więc nie musi być komentarzem. Może to pozostać osobną odpowiedzią.
slhck,
1
Twoja początkowa próba z linkami względnymi jest po prostu błędna i dlatego nie działa. Źle zrozumiałeś, jak działają linki względne. Nie ma w tym nic szczególnie trudnego (nawet jeśli używasz OS X). Być może inne odpowiedzi mówią o ryzyku katalogu roboczego podczas tworzenia łącza. Miało to na celu ułatwienie prawidłowego wykonania łącza i nie jest w żaden sposób konieczne. Nie definiujesz ścieżki względnej względem bieżącego katalogu, ale do katalogu łącza. Oto, czego ln -s Dropbox/git/codyhess/bin ~/bin
Timo
Również @slhck, gdy ktoś pyta konkretnie, jak utworzyć linki względne w jakim świecie, powiedzenie, że możesz robić linki bezwzględne, stanowi „realne rozwiązanie”? W szczególności nie odpowiada na pytanie PO, a zatem jest zupełnie odwrotnością rozwiązania, nie ma rozwiązania. To nie powinien być komentarz ani odpowiedź, powinno to być pytanie „Jak dokładnie działają linki względne (wyjaśnione, aby użytkownicy komputerów Mac to zrozumieli)?”. Mam nadzieję, że ten użytkownik systemu Mac wyjaśnił to wystarczająco dobrze. :)
Timo
@TimoLehto Być może chcesz skierować komentarz do oryginalnego autora (Cody Hess). Skopiowałem tylko post.
slhck
@slhck, skierowałem go do ciebie, ponieważ uznałeś to rozwiązanie za „wykonalne”, a twój komentarz sprawił, że pomyślałem, że to ty przekonasz, jeśli ktoś chce oznaczyć odpowiedź jako „nie odpowiedź” (i uzyskać flagowanie zaakceptowane).
Timo
0

Chciałem tylko wyjaśnić, jak utworzyć dowiązanie symboliczne przy użyciu ścieżek względnych (ze szczegółowym przykładem).

Jak wspomniano w komentarzach Ignacio Vazquez-Abrams, musisz określić lokalizację pliku / folderu w odniesieniu do miejsca, w którym zostanie utworzone dowiązanie symboliczne, a nie w stosunku do bieżącego katalogu.

PRZYKŁAD

Jesteś w /usr/share/nginx/html/_src/learn Utworzysz dowiązanie symboliczne codingw/usr/share/nginx/html

Utwórz względne dowiązanie symboliczne (teorię):

sudo ln -s /path/to/source/file-or-folder/relative/from/symlink /path/to/symlink/relative/to/current/location

Utwórz rzeczywiste względne dowiązanie symboliczne:

sudo ln -s ./_src/learn/coding ../../coding

Więcej informacji (ten sam przykład)

current path:                                  /usr/share/nginx/html/_src/learn
symlink(to be) relative to current path:       ../../coding                 
symlink location (absolute):                   /usr/share/nginx/html/coding
folder/file relative to symlink location:      ./_src/learn/coding
folder/file absolute path:                     /usr/share/nginx/html/_src/learn/coding  
Próbuj dalej
źródło