Jak mogę dowiązać symbolicznie plik w systemie Linux? [Zamknięte]


1937

Chcę zrobić dowiązanie symboliczne w Linuksie. Napisałem to polecenie Bash, w którym pierwsza ścieżka to folder, do którego chcę prowadzić link, a druga to skompilowane źródło.

ln -s '+basebuild+'/IpDome-kernel/kernel /home/build/sandbox/gen2/basebuild/IpDome-kernel/kernal 

Czy to jest poprawne?


Prawdopodobnie powinieneś zadać to pytanie na unix.stackexchange.com
Guss

Odpowiedzi:


3676

Aby utworzyć nowe dowiązanie symboliczne (zakończy się niepowodzeniem, jeśli dowiązanie symboliczne już istnieje):

ln -s /path/to/file /path/to/symlink

Aby utworzyć lub zaktualizować dowiązanie symboliczne:

ln -sf /path/to/file /path/to/symlink

381
@micapam lnSkładnia jest podobna do cpskładni, np . miejsce docelowe źródła .
Andrey,

156
Oto dla ciebie mnemonik: l (i) n (k) -s (ymbolic) <cel> <nazwa opcjonalna> (fakt, że ostatni parametr jest opcjonalny, pomaga dowiedzieć się, że to nie jest cel) (btw pomijając ścieżka do dowiązania symbolicznego tworzy łącze w bieżącym katalogu o tej samej nazwie basename co cel)
UncleZeiv

32
@micapam Tak jak cpjest CoPy, lnjest LiNk. Pierwsza i trzecia litera.
Cole Johnson

68
Spędziłem kilka minut, próbując dowiedzieć się, dlaczego to nie zadziałało. Stworzyło samo-zapętlone łącze. Wygląda na to, że plik / path / to / powinien być bezwzględny i niezwiązany z „bieżącym folderem”. Być może zwróć na to uwagę w odpowiedzi?
Abhishek Anand

52
@AbhishekAnand minęło kilka lat, ale chciałem po prostu zostawić notatkę, że robi praca ze ścieżek względnych; po prostu musi być względny do katalogu wynikowego dowiązania symbolicznego, a nie do katalogu bieżącego. To, co piszesz jako pierwszy argument ścieżki, jest w rzeczywistości dosłownie tekstem, który będzie wewnątrz dowiązania symbolicznego; dlatego, gdy jest względny, musi być względny do linku.
JoL

302
ln -s TARGET LINK_NAME

Gdzie -sczyni to symbolicznym.


2
TARGET i LINKNAME to lepszy sposób na zapamiętanie. btw do usunięcia dowiązania symbolicznego:unlink LINK_NAME
Silvan

31
Lubię wyrażenie to w ten sposób: ln -s where-the-symlink-should-point where-to-place-the-symlink-itself.
totymedli

@Silvan możesz usunąć dowiązanie symboliczne rm, ale większość ludzi nie wie, aby usunąć końcowy link /.
FreeSoftwareServers

288
ln -s EXISTING_FILE_OR_DIRECTORY SYMLINK_NAME

2
Lepsza niż zaakceptowana odpowiedź i pokryta jednoznaczną zwięzłością.
Josh Habdas

3
Tyle że nie jest to nowa nazwa dowiązania symbolicznego. Jest to nazwa lub pełna ścieżka (w stosunku do cur dir lub absolutu) dla nowego dowiązania symbolicznego, w tym nazwy.
David Spector,

l -s EXISTING_FILE_OR_DIRECTORY {opcjonalna ścieżka do /} SYMLINK_NAME i nie umieszczaj końcowego ukośnika na dowiązaniu symbolicznym, ponieważ nie jest to katalog
dzisiejszy


88

(Ponieważ obraz ASCII jest wart tysiąca znaków.)

Strzała może być pomocnym mnemonikiem, zwłaszcza, że ​​prawie dokładnie tak wygląda u Emacsa.

I duże zdjęcie, aby nie pomylić go z wersją systemu Windows

Linux:

ln -s target <- linkName

Windows:

mklink linkName -> target

Możesz również spojrzeć na to jako

ln -s "to-here" <- "from-here"
mklink "from-here" -> "to-here"

Nie from-herepowinien jeszcze istnieć, należy go stworzyć, a to-herepowinien już istnieć (IIRC).

(Zawsze mylę się, czy różne polecenia i argumenty powinny dotyczyć wcześniej istniejącej lokalizacji, czy też takiej, którą należy wykonać).

EDYCJA: Wciąż dla mnie powoli zapada się; Mam inny sposób, który napisałem w swoich notatkach.

ln -s (target exists) (link is made)
mklink (link is made) (target exists)

W Emacsie diredjest to bardzo łatwe, gdy umieścisz kursor nad celem, naciśnij Si wpisz katalog, w którym chcesz utworzyć łącze. Skraca lukę między wyobrażeniem sobie pożądanego rezultatu a pisaniem. Zobacz gnu.org/software/emacs/manual/html_node/emacs/… .
Brady Trainor

2
Mój mnemonik jest włączony: ln -s Original Newfile (symlink)
robstarbuck

to zadziałało dla mnie
Haider Ali,


22

Do pierwotnego pytania:


'ln -s '+basebuild+'/IpDome-kernel/kernel /home/build/sandbox/gen2/basebuild/IpDome-kernel/kernal'

To rzeczywiście stworzy dowiązanie symboliczne ( -s) z pliku / katalogu:

<basebuild>/IpDome-kernel/kernel

do twojego nowego linku

/home/build/sandbox/gen2/basebuild/IpDome-kernel/kernal

Oto kilka sposobów na zapamiętanie:

Po pierwsze, jest strona man dlaln . Możesz uzyskać do niego dostęp, wyszukując hasło „man ln” w google, lub po prostu otwórz okno terminala i wpisz, man lna otrzymasz te same informacje. Strona podręcznika wyraźnie stwierdza:

W [OPCJA] ... [-T] TARGET LINK_NAME (1. formularz)


Jeśli konieczność przeszukiwania lub czytania strony podręcznika za każdym razem nie jest dla ciebie, być może łatwiej będzie ci pamiętać, że wszystkie polecenia nix działają w ten sam sposób:

cp /file/that/exists /location/for/new/file
mv /file/that/exists /location/its/moving/to
ln /file/that/exists /the/new/link

cp kopiuje istniejący plik (pierwszy argument) do nowego pliku (drugi argument).
mv przenosi plik, który obecnie istnieje (pierwszy argument) w nowe miejsce (drugi argument)

Podobnie lnłączy plik, który obecnie istnieje (pierwszy argument) z nowym łączem (drugi argument) *


Ostatnią opcją, którą chciałbym zasugerować, jest stworzenie własnych stron podręcznika, które są łatwe do odczytania i łatwe (dla ciebie) do znalezienia / zapamiętania. Po prostu zrób prosty skrypt powłoki, który da ci wskazówkę, której potrzebujesz. Na przykład :

W pliku .bash_aliases możesz umieścić coś takiego:

commandsfx() {
    echo "Symlink:  ln -s /path/to/file /path/to/symlink"
    echo "Copy:     cp /file/to/copy /destination/to/send/copy"
}

alias 'cmds'=commandsfx

Następnie, gdy będziesz go potrzebować, po prostu wpisz w wierszu polecenia cmdsodpowiednią składnię, abyś mógł ją szybko odczytać i zrozumieć. Możesz sprawić, by te funkcje były tak zaawansowane, jak chcesz, aby uzyskać potrzebne informacje - to zależy od Ciebie. Możesz nawet sprawić, by były interaktywne, więc wystarczy postępować zgodnie z instrukcjami .. coś takiego:

makesymlink() {
    echo "Symlink name:"
    read sym
    echo "File to link to:"
    read fil
    ln -s $fil $sym
}

alias 'symlink'=makesymlink

* - no cóż, oczywiście wszyscy mogą przyjmować różne parametry i robić różne rzeczy oraz mogą pracować na plikach i katalogach ... ale założenie jest takie samo
♦ - przykłady z użyciem powłoki bash


18
ln [-Ffhinsv] source_file [target_file]

    link, ln -- make links

        -s    Create a symbolic link.

    A symbolic link contains the name of the file to which it is linked. 

    An ln command appeared in Version 1 AT&T UNIX.

16

Tworzenie dowiązań symbolicznych lub dowiązań miękkich w systemie Linux:

Otwórz monit Bash i wpisz poniższe polecenie, aby utworzyć dowiązanie symboliczne do pliku:

A) Przejdź do folderu, w którym chcesz utworzyć miękki link i wpisz polecenie, jak wspomniano poniżej :

$ ln -s (path-to-file) (symbolic-link-to-file)
$ ln -s /home/user/file new-file

B) Przejdź do ścieżki nowej nazwy pliku i wpisz :

$ ls -lrt (To see if the new-file is linked to the file or not)

Przykład:

user@user-DT:[~/Desktop/soft]# ln -s /home/user/Desktop/soft/File_B /home/user/Desktop/soft/File_C
user@user-DT:[~/Desktop/soft]# ls -lrt
total 0
-rw-rw-r-- 1 user user  0 Dec 27 16:51 File_B
-rw-rw-r-- 1 user user  0 Dec 27 16:51 File_A
lrwxrwxrwx 1 user user 31 Dec 27 16:53 File_C -> /home/user/Desktop/soft/File_B


Note: Where, File_C -> /home/user/Desktop/soft/File_B  Means, File_C is symbolically linked to File_B

12

ln -s sourcepath linkpathname

Uwaga:

-s tworzy dowiązania symboliczne zamiast dowiązań twardych


11

Jeśli znajdujesz się w katalogu, w którym chcesz utworzyć dowiązanie symboliczne, zignoruj ​​drugą ścieżkę.

cd myfolder
ln -s target

Stworzy symlink targetwewnątrz myfolder.

Ogólna składnia

ln -s TARGET LINK_NAME

11

To jest przepełnienie stosu, więc zakładam, że chcesz kod:

Cały poniższy kod zakłada, że ​​chcesz utworzyć dowiązanie symboliczne o nazwie /tmp/linkdowiązanie do /tmp/realfile.

UWAGA : Chociaż ten kod sprawdza błędy, NIE sprawdza, czy /tmp/realfilerzeczywiście istnieje! Wynika to z faktu, że martwy link jest nadal aktualny i w zależności od kodu możesz (rzadko) chcieć utworzyć link przed rzeczywistym plikiem.


Shell (bash, zsh, ...)

#!/bin/sh
ln -s /tmp/realfile /tmp/link

Naprawdę proste, tak jak zrobiłbyś to w linii poleceń (która jest powłoką). Cała obsługa błędów jest wykonywana przez interpreter powłoki. Ten kod zakłada, że ​​masz działającego interpretera powłoki /bin/sh.

W razie potrzeby nadal możesz zaimplementować własną obsługę błędów za pomocą $?zmiennej, która zostanie ustawiona na 0 tylko wtedy, gdy łącze zostanie pomyślnie utworzone.

C i C ++

#include <unistd.h>
#include <stdio.h>

int main () {
  if( symlink("/tmp/realfile", "/tmp/link") != 0 )
    perror("Can't create the symlink");
}

symlinkzwraca 0 tylko wtedy, gdy można utworzyć łącze. W innych przypadkach używam, perroraby powiedzieć więcej o problemie.

Perl

#!/usr/bin/perl
if( symlink("/tmp/realfile", "/tmp/link") != 1) {
  print STDERR "Can't create the symlink: $!\n"
}

Ten kod zakłada, że ​​masz perl 5 interpreter w /usr/bin/perl. symlinkzwraca tylko 1, jeśli można utworzyć łącze. W innych przypadkach drukuję przyczynę niepowodzenia na standardowym wyjściu błędu.


1
Dodano objaśnienie, a także ostrzeżenie o martwych linkach. Nie sprawdzam tego, ponieważ nie można zakładać, że nie jest to pożądane, a także dlatego, że nie ma już testów na temat plików
Garo

8

Chciałbym przedstawić prostszą wersję angielską opisów już przedstawionych.

 ln -s  /path-text/of-symbolic-link  /path/to/file-to-hold-that-text

Polecenie „ln” tworzy PLIK-link, a „-s” określa, że ​​typ łącza będzie symboliczny. Przykład pliku z dowiązaniem symbolicznym można znaleźć w instalacji WINE (użycie „ls -la” do wyświetlenia jednego wiersza zawartości katalogu):

 lrwxrwxrwx 1 me power 11 Jan  1 00:01 a: -> /mnt/floppy

Standardowe informacje o pliku znajdują się po lewej stronie (chociaż zauważ, że pierwszy znak to „l” dla „linku”); nazwa pliku to „a:”, a „->” oznacza także, że plik jest linkiem. W zasadzie mówi WINE, w jaki sposób Windows „Drive A:” ma być skojarzony z dyskietką w Linuksie. Aby faktycznie utworzyć dowiązanie symboliczne PODOBNE do tego (w bieżącym katalogu i zrobić to dla WINE jest bardziej skomplikowane; użyj narzędzia „winecfg”):

 ln -s  /mnt/floppy  a:   //will not work if file a: already exists

7

Aby utworzyć dowiązanie symboliczne / dowiązanie miękkie, użyj:

ln -s {source-filename} {symbolic-filename}

na przykład:

ln -s file1 link1

4

Istnieją dwa rodzaje linków:

dowiązania symboliczne: odwołaj się do ścieżki symbolicznej wskazującej abstrakcyjne położenie innego pliku

twarde linki: odnoszą się do konkretnej lokalizacji danych fizycznych.

W twoim przypadku dowiązania symboliczne:

ln -s source target

możesz odnieść się do http://man7.org/linux/man-pages/man7/symlink.7.html

możesz utworzyć zbyt twarde linki

Twardy link do pliku jest nie do odróżnienia od oryginalnej pozycji katalogu; wszelkie zmiany w pliku są faktycznie niezależne od nazwy użytej w odniesieniu do pliku. Dowiązania twarde zwykle nie odnoszą się do katalogów i mogą nie obejmować systemów plików.

ln source link

4

Linki są w zasadzie dwóch rodzajów:

Łącza symboliczne (miękkie): łącze do ścieżki symbolicznej wskazującej abstrakcyjne położenie innego pliku

Twarde linki: link do konkretnej lokalizacji danych fizycznych.

Przykład 1:

ln /root/file1 /root/file2

Powyżej jest przykładem twardego linku, w którym możesz mieć kopię swoich fizycznych danych.

Przykład 2:

ln -s /path/to/file1.txt /path/to/file2.txt

Powyższe polecenie utworzy dowiązanie symboliczne do pliku1.txt.

Jeśli usuniesz plik źródłowy, nie będziesz miał nic do miejsca docelowego w wersji miękkiej.

Kiedy to zrobisz:

ls -lai

Zobaczysz, że dla dowiązań symbolicznych jest inny numer i-węzła.

Aby uzyskać więcej informacji, możesz przeczytać stronę podręcznika ln w systemie Linux.


hard link where you can have a copy of your physical data- Myślę, że nie tworzymy kopii danych fizycznych. Po prostu inna nazwa dla tych samych danych fizycznych.
Alexander Radchenko

3

Trochę mylę terminologie „cel” i „katalog” w informacjach o człowieku.

Celem jest folder, do którego prowadzimy dowiązanie, a katalog to rzeczywiste dowiązanie symboliczne (nie katalog, do którego będziesz dowiązanie symboliczne), jeśli ktoś doświadcza tego samego zamieszania, nie czuj się samotny.

Oto moja interpretacja tworzenia dowiązania symbolicznego (w systemie Linux):

ln -s /FULL/PATH/FOLDER-OR-FILE-SYMLINKING-TO NAME-OF-YOUR-SYMLINK

Możesz przejść do folderu, w którym chcesz utworzyć dowiązanie symboliczne, i uruchomić polecenie lub podać PEŁNĄ ŚCIEŻKĘ dla swojego dowiązania symbolicznego zamiast NAZWA-SWOJEGO SYMLINKA.

cd /FULL/PATH/TO/MY-SYMLINK-PARENT-FOLDER
ln -s /FULL/PATH/FOLDER-OR-FILE-SYMLINKING-TO NAME-OF-YOUR-SYMLINK

LUB

ln -s /FULL/PATH/FOLDER-OR-FILE-SYMLINKING-TO /FULL/PATH/TO/MY-SYMLINK-PARENT-FOLDER/NAME-OF-YOUR-SYMLINK

Mam nadzieję, że to pomaga tym (wciąż) nieco zdezorientowanym.


-2

Jak utworzyć dowiązanie symboliczne w włóczęgi. Kroki:

  1. W pliku Vagrant utwórz zsynchronizowany folder. np. config.vm.synced_folder "F: / Sunburst / source / sunburst / lms", "/ source" F: / Sunburst / source / sunburst / lms: - gdzie kod źródłowy, / source: - ścieżka katalogu wewnątrz włóczęgi
  2. Vagrant up i wpisz vagrant ssh i przejdź do katalogu źródłowego, np. Źródła cd
  3. Sprawdź, czy struktura folderów kodu źródłowego jest dostępna w katalogu źródłowym. np. / source / local
  4. Następnie przejdź do katalogu maszyny gościa, w którym pliki skojarzone z przeglądarką. Po uzyskaniu kopii zapasowej pliku. np. sudo mv local local_bk
  5. Następnie utwórz dowiązanie symboliczne, np. Sudo ln -s / source / local local. local oznacza link-name (nazwa folderu na maszynie gościa, którą chcesz połączyć), jeśli chcesz usunąć dowiązanie symboliczne: - Wpisz sudo rm local
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.