Come posso collegare simbolicamente un file in Linux? [chiuso]


1941

Voglio creare un collegamento simbolico in Linux. Ho scritto questo comando Bash in cui il primo percorso è la cartella in cui voglio collegarmi e il secondo percorso è la fonte compilata.

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

È corretto?


Probabilmente dovresti porre questa domanda a unix.stackexchange.com
Guss il

Risposte:


3679

Per creare un nuovo collegamento simbolico (non riuscirà se il collegamento simbolico esiste già):

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

Per creare o aggiornare un collegamento simbolico:

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

382
@micapam La lnsintassi è simile alla cpsintassi, ad esempio la destinazione di origine .
Andrey,

157
Ecco un mnemonico per te: l (i) n (k) -s (ymbolic) <target> <nome facoltativo> (il fatto che l'ultimo parametro sia facoltativo ti aiuta a capire che non è l'obiettivo) (tra l'altro tralasciando percorso del collegamento simbolico crea un collegamento nella directory corrente con lo stesso nome di base della destinazione)
UncleZeiv

32
@micapam Così come cpè CoPy, lnè LiNk. Prima e terza lettera.
Cole Johnson,

68
Ho trascorso diversi minuti a cercare di capire perché questo non funzionasse per me. Ha creato un collegamento self-loop. Sembra che il file / path / to / sia assoluto e non relativo alla "cartella corrente". Forse sottolineare questo nella risposta?
Abhishek Anand,

52
@AbhishekAnand E 'stato un paio di anni, ma volevo solo lasciare la nota che si fa il lavoro con i percorsi relativi; deve solo essere relativo alla directory del link simbolico risultante e non alla directory corrente. Quello che scrivi come primo argomento del percorso è in realtà, letteralmente, il testo che si troverà all'interno del collegamento simbolico; ecco perché, quando è relativo, deve essere relativo al collegamento.
JoL

302
ln -s TARGET LINK_NAME

Dove lo -srende simbolico.


2
TARGET e LINKNAME sono il modo migliore per ricordare. btw per cancellare l'uso del link simbolico:unlink LINK_NAME
Silvan

31
Mi piace frase in questo modo: ln -s where-the-symlink-should-point where-to-place-the-symlink-itself.
totymedli,

@Silvan puoi eliminare un link simbolico tramite rm, ma la maggior parte delle persone non sa rimuovere il trailing /.
FreeSoftwareServers dal

288
ln -s EXISTING_FILE_OR_DIRECTORY SYMLINK_NAME

2
Meglio della risposta accettata e coperta con inequivocabile brevità.
Josh Habdas,

3
Solo che non è il nuovo nome del collegamento simbolico. È il nome o un percorso completo (relativo alla directory corrente o assoluto) per il nuovo collegamento simbolico incluso il nome.
David Spector,

ls -s EXISTING_FILE_OR_DIRECTORY {percorso opzionale a /} SYMLINK_NAME e non inserire una barra finale sul collegamento simbolico, in quanto non è una directory
comfytoday


88

(Perché un'immagine ASCII vale più di mille caratteri.)

Una freccia può essere un utile mnemonico, soprattutto perché è quasi esattamente come appare nella direzione di Emacs.

E grande immagine in modo da non confonderla con la versione di Windows

Linux:

ln -s target <- linkName

Finestre:

mklink linkName -> target

Potresti anche guardare questi come

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

Non from-heredovrebbe ancora esistere, deve essere creato, mentre to-heredovrebbe già esistere (IIRC).

(Mi confondo sempre se vari comandi e argomenti debbano coinvolgere un luogo preesistente o uno da effettuare.)

EDIT: Sta ancora affondando lentamente per me; Ho un altro modo in cui ho scritto nelle mie note.

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

In Emacs ' dired, è semplicissimo, posizionando il cursore sul bersaglio, premendo Se digitando la directory in cui si desidera creare il collegamento. Riduce il divario tra l'immaginazione del risultato desiderato e la digitazione. Vedi gnu.org/software/emacs/manual/html_node/emacs/… .
Brady Trainor,

2
My mnemonic is ON: ln -s Original Newfile (symlink)
robstarbuck

questo ha funzionato per me
Haider Ali,


22

Alla domanda originale:


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

Questo creerà effettivamente un collegamento simbolico ( -s) dalla directory file /:

<basebuild>/IpDome-kernel/kernel

al tuo nuovo link

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

Ecco alcuni modi per aiutarti a ricordare:

Innanzitutto, c'è la pagina man perln . Puoi accedervi cercando "man ln" in google o semplicemente aprendo una finestra del terminale e digitando man lne otterrai le stesse informazioni. La pagina man indica chiaramente:

ln [OPTION] ... [-T] TARGET LINK_NAME (1 ° modulo)


Se devi cercare o leggere una pagina man ogni volta che non fa per te, forse avrai un momento più facile ricordare che tutti i comandi nix funzionano allo stesso modo:

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

cp copia un file attualmente esistente (il primo argomento) in un nuovo file (il secondo argomento).
mv sposta un file attualmente esistente (il primo argomento) in una nuova posizione (il secondo argomento)

Allo stesso modo lncollega un file attualmente esistente (il primo argomento) a un nuovo collegamento (il secondo argomento) *


L'ultima opzione che vorrei suggerire è che puoi creare le tue pagine man che sono facili da leggere e facili da trovare / ricordare per te. Basta creare un semplice script shell che ti dia il suggerimento di cui hai bisogno. Ad esempio :

Nel tuo file .bash_aliases puoi inserire qualcosa come:

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

alias 'cmds'=commandsfx

Quindi quando ne hai bisogno, dalla riga di comando digita cmdse otterrai la sintassi corretta in modo da poterla leggere e comprendere rapidamente. Puoi rendere queste funzioni tanto avanzate quanto desideri ottenere quali informazioni ti occorrono, dipende da te. Potresti anche renderli interattivi, quindi devi solo seguire le istruzioni .. qualcosa del tipo:

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

alias 'symlink'=makesymlink

* - beh ovviamente possono tutti prendere parametri diversi e fare cose diverse e possono lavorare sia su file che su directory ... ma la premessa è la stessa
♦ - esempi usando la shell 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

Creazione di collegamenti simbolici o collegamenti soft su Linux:

Apri il prompt di Bash e digita il comando di seguito indicato per creare un collegamento simbolico al tuo file:

A) Andare alla cartella in cui si desidera creare un collegamento software e digitare il comando come indicato di seguito :

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

B) Vai al percorso del nome del tuo nuovo file e digita :

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

Esempio:

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

Nota:

-s crea collegamenti simbolici anziché collegamenti reali


11

Se ci si trova nella directory in cui si desidera creare un collegamento simbolico, ignorare il secondo percorso.

cd myfolder
ln -s target

Creerà un collegamento simbolico targetall'interno myfolder.

Sintassi generale

ln -s TARGET LINK_NAME

11

Questo è Stack Overflow, quindi presumo che tu voglia il codice:

Tutto il codice seguente presuppone che si desideri creare un collegamento simbolico denominato a /tmp/linkcui si collega /tmp/realfile.

ATTENZIONE : sebbene questo codice verifichi la presenza di errori, NON controlla se /tmp/realfileesiste realmente! Questo perché un collegamento non funzionante è ancora valido e, a seconda del codice, potresti (raramente) creare il collegamento prima del file reale.


Shell (bash, zsh, ...)

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

Davvero semplice, proprio come faresti dalla riga di comando (che è la shell). L'intera gestione degli errori viene eseguita dall'interprete della shell. Questo codice presuppone che tu abbia un interprete di shell funzionante su /bin/sh.

Se necessario, è comunque possibile implementare la propria gestione degli errori utilizzando la $?variabile che verrà impostata su 0 solo se il collegamento è stato creato correttamente.

C e C ++

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

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

symlinkrestituisce 0 solo quando è possibile creare il collegamento. In altri casi sto usando perrorper dire di più sul problema.

Perl

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

Questo codice presuppone che tu abbia un interprete perl 5 su /usr/bin/perl. symlinkrestituisce 1 solo se è possibile creare il collegamento. In altri casi sto stampando il motivo dell'errore sull'output di errore standard.


1
Spiegazione aggiunta, anche una parola di cautela per i collegamenti morti. Non sto verificando questo, perché non si può presumere che ciò non sia voluto e anche perché i filetest non sono più in tema
Garo,

8

Vorrei presentare una versione in inglese più semplice delle descrizioni già presentate.

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

Il comando "ln" crea un FILE di collegamento e "-s" specifica che il tipo di collegamento sarà simbolico. Un esempio di un file con collegamento simbolico può essere trovato in un'installazione WINE (usando "ls -la" per mostrare una riga del contenuto della directory):

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

Le informazioni standard sui file sono a sinistra (sebbene si noti che il primo carattere è una "l" per "collegamento"); il nome del file è "a:" e "->" indica anche che il file è un collegamento. Fondamentalmente dice a WINE come Windows "Drive A:" deve essere associato a un'unità floppy in Linux. Creare effettivamente un collegamento simbolico SIMILE a quello (nella directory corrente e farlo effettivamente per WINE è più complicato; utilizzare l'utilità "winecfg"):

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

7

Per creare un collegamento simbolico / collegamento software, utilizzare:

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

per esempio:

ln -s file1 link1

4

Esistono due tipi di collegamenti:

collegamenti simbolici: fare riferimento a un percorso simbolico che indica la posizione astratta di un altro file

hard link: fare riferimento alla posizione specifica dei dati fisici.

Nel tuo caso symlink:

ln -s source target

puoi fare riferimento a http://man7.org/linux/man-pages/man7/symlink.7.html

puoi creare collegamenti troppo duri

Un collegamento reale a un file non è distinguibile dalla voce della directory originale; eventuali modifiche a un file sono effettivamente indipendenti dal nome utilizzato per fare riferimento al file. I collegamenti reali potrebbero non riferirsi normalmente alle directory e potrebbero non estendersi ai file system.

ln source link

4

I collegamenti sono fondamentalmente di due tipi:

Collegamenti simbolici (soft): collegamento a un percorso simbolico che indica la posizione astratta di un altro file

Collegamenti reali: collegamento alla posizione specifica dei dati fisici.

Esempio 1:

ln /root/file1 /root/file2

Quanto sopra è un esempio di un collegamento reale in cui è possibile avere una copia dei dati fisici.

Esempio 2:

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

Il comando sopra creerà un collegamento simbolico a file1.txt.

Se elimini un file sorgente, non avrai nulla a destinazione in soft.

Quando lo fai:

ls -lai

Vedrai che esiste un numero di inode diverso per i symlink.

Per maggiori dettagli, puoi leggere la pagina man di ln sul tuo sistema operativo Linux.


hard link where you can have a copy of your physical data- Penso che non creiamo una copia dei dati fisici. Solo un altro nome per gli stessi dati fisici.
Alexander Radchenko,

3

Trovo un po 'confuso le terminologie "target" e "directory" nelle informazioni man.

Il target è la cartella a cui stiamo collegando il link simbolico e la directory il link simbolico effettivo (non la directory con cui ti collegherai al link simbolico), se qualcuno sta vivendo la stessa confusione, non sentirti solo.

Questa è la mia interpretazione della creazione di un Symlink (in Linux):

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

È possibile accedere alla cartella in cui si desidera creare il collegamento simbolico ed eseguire il comando o specificare il PERCORSO COMPLETO per il collegamento simbolico anziché NAME-OF-YOUR-SYMLINK.

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

O

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

Spero che questo aiuti a quelli (ancora) leggermente confusi.


-2

Come creare un collegamento simbolico in vagabondo. passi:

  1. Nel file vagabondo creare una cartella sincronizzata. es. config.vm.synced_folder "F: / Sunburst / source / sunburst / lms", "/ source" F: / Sunburst / source / sunburst / lms: - dove il codice sorgente, / source: - percorso della directory all'interno del vagabondo
  2. Vagrant up e digitare vagrant ssh e andare alla directory dei sorgenti, ad esempio cd sorgente
  3. Verificare che la struttura della cartella del codice sorgente sia disponibile nella directory di origine. ad es. / fonte / locale
  4. Quindi vai alla directory della macchina guest in cui i file associati al browser. Dopo aver ottenuto il backup del file. ad es. sudo mv local local_bk
  5. Quindi creare un collegamento simbolico, ad esempio sudo ln -s / source / local local. nome-collegamento medio locale (nome della cartella nel computer guest che si intende collegare) se è necessario rimuovere il collegamento simbolico: - Digitare sudo rm local
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.