Utwórz dowiązanie symboliczne względem bieżącego katalogu

110

Próbuję utworzyć symboliczne łącze w moim katalogu domowym, które wskazuje na katalog na zewnętrznym dysku twardym.

Działa dobrze, gdy określę to w następujący sposób:

cd ~
ln -s /run/media/name/exhdd/Data/ Data

Jednak, gdy próbuję, tworzy to wadliwy link:

cd /run/media/name/exhdd
ln -s Data/ ~/Data

To tworzy link, do którego nie mogę się dostać cd.

Kiedy próbuję, bash narzeka:

bash: cd: Data: Too many levels of symbolic links

Łącze symboliczne Data w moim domu ma również kolor czerwony, gdy lsjest ustawiony na wyświetlanie kolorowych wyników.

Dlaczego to się dzieje? Jak mogę utworzyć link w ten sposób? (Chcę utworzyć dowiązanie symboliczne do katalogu w moim katalogu roboczym w innym katalogu).


Edycja: zgodnie z odpowiedzią StackOverflow, jeśli drugi argument (w moim przypadku byłby to ~ / Data) już istnieje i jest katalogiem, lnutworzy dowiązanie symboliczne do celu w tym katalogu.

Jednak mam ten sam problem z:

ln -s Data/ ~/
jcora
źródło
7
Tylko losowa wskazówka: cd ~zwykle jest taka sama jak cd.
3
ls -l ~/Datapomógłby Ci zobaczyć, co było nie tak z linkiem „czerwony”.
msw
Hm, nie wiedziałem, że mogę to zrobić, dzięki. Pamiętam, że próbowałem cat, ale zapomniałem co było wynikiem ... (nie jestem w domu na nich chwila.)
jcora
Na marginesie, że chcesz tylko utworzyć dowiązania wszystkich plików, dir i podkatalogu wewnątrz określonego folderu, powiedzmy, wszystkie elementy wewnątrz /run/media/name/exhdd/Data/, aby Datanastępnie użyć następującegoln -s /run/media/name/exhdd/Data/* Data
user2555595

Odpowiedzi:

115

Oto co się dzieje. Jeśli utworzysz dowiązanie symboliczne ze ścieżką względną, dowiązanie symboliczne będzie względne. Dowiązania symboliczne przechowują ścieżki, które im podajesz. Nigdy nie rozwiązują ścieżek do pełnych ścieżek. Bieganie

$ pwd
/usr/bin
$ ln -s ls /usr/bin/ls2

tworzy dowiązania o nazwie ls2w /usr/bincelu ls(viz. /usr/bin/ls) w stosunku do katalogu dowiązanie jest w ( /usr/bin). Powyższe polecenie utworzy funkcjonalne dowiązanie symboliczne z dowolnego katalogu.

$ pwd
/home/me
$ ln -s ls /usr/bin/ls2

Jeśli przeniesiesz dowiązanie symboliczne do innego katalogu, przestanie on wskazywać na plik w /usr/bin/ls.

Tworzysz dowiązanie symboliczne, które wskazuje Datai nazywasz je Data. Wskazuje na siebie. Musisz utworzyć dowiązanie symboliczne z bezwzględną ścieżką do katalogu.

ln -s "$(realpath Data)" ~/Data
Ujjwal Singh
źródło
14

Miałem ten sam problem. Google doprowadziło do tej odpowiedzi, ale najprostsze rozwiązanie nie jest tutaj udokumentowane:

ln -sT 

-T załatwia sprawę

człowiek ln:

-T, --no-target-directory
    treat LINK_NAME as a normal file always

Dodam to tutaj, aby każdy z tym samym pytaniem mógł to znaleźć :)

tiegs
źródło
9

lnzachowanie względem ścieżek względnych jest nieintuicyjne. Aby przywrócić zdrowie psychiczne, użyj -rflagi.

cd /run/media/name/exhdd
ln -sr Data/ ~/Data

Wyjaśnienie:

   -r, --relative
          create symbolic links relative to link location

Oznacza to, że lnzrobi to, czego oczekujesz. Weźmie pod uwagę katalog, w którym się znajdujesz, katalog, w którym znajduje się cel, i konstruujemy ścieżkę względem katalogu, w którym znajduje się link. Domyślnym zachowaniem (bez -r) jest interpretacja pierwszego parametru (celu) dosłownie , w w takim przypadku musisz samodzielnie zbudować ścieżkę, aby była poprawna w katalogu łącza.

Alternatywnie użyj ścieżki bezwzględnej, jak wspomniano w @SmithJohn

ln -s "$(realpath Data)" ~/Data #bash shell

lub

ln -s "(realpath Data)" ~/Data #fish shell
Aleksandr Dubinsky
źródło
-1

Bardzo prosto możesz utworzyć link do folderu. Spójrz na moje polecenie

ln -s / home / targetatedfolder / var / www / html / link_name

Bhupendra Sahu
źródło