Comment créer un lien symbolique vers un fichier sous Linux? [fermé]

1942

Je veux faire un lien symbolique sous Linux. J'ai écrit cette commande Bash où le premier chemin est le dossier dans lequel je veux créer un lien et le deuxième chemin est la source compilée.

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

Est-ce correct?

chrissygormley
la source
Vous devriez probablement poser cette question sur unix.stackexchange.com
Guss
Peut-être superuser.com .
Justin Liu

Réponses:

3680

Pour créer un nouveau lien symbolique (échouera si le lien symbolique existe déjà):

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

Pour créer ou mettre à jour un lien symbolique:

ln -sf /path/to/file /path/to/symlink
hsz
la source
382
@micapam La lnsyntaxe est similaire à la cpsyntaxe, par exemple la destination source .
Andrey
157
Voici un mnémonique pour vous: l (i) n (k) -s (ymbolic) <target> <nom facultatif> (le fait que le dernier paramètre soit facultatif vous aide à comprendre que ce n'est pas la cible) (btw en laissant de côté le chemin vers le lien symbolique crée un lien dans le répertoire courant avec le même nom de base que la cible)
UncleZeiv
32
@micapam Tout comme cpc'est CoPy, lnest LiNk. Première et troisième lettres.
Cole Johnson
68
J'ai passé plusieurs minutes à essayer de comprendre pourquoi cela ne fonctionnait pas pour moi. Il a créé un lien en boucle automatique. Il semble que le fichier / path / to / soit absolu et non relatif au "dossier courant". Peut-être le souligner dans la réponse?
Abhishek Anand
52
@AbhishekAnand il a été quelques années, mais je voulais juste laisser la note qu'il fait travailler avec des chemins relatifs; il doit simplement être relatif au répertoire du lien symbolique résultant et non au répertoire actuel. Ce que vous écrivez comme premier argument de chemin est en fait, textuellement, le texte qui va être à l'intérieur du lien symbolique; c'est pourquoi, quand il est relatif, il doit être relatif au lien.
JoL
302
ln -s TARGET LINK_NAME

Où le -srend symbolique.

cyborg
la source
2
TARGET & LINKNAME sont une meilleure façon de se souvenir. btw pour supprimer l'utilisation du lien symbolique:unlink LINK_NAME
Silvan
31
Je tiens à l' exprimer ainsi: ln -s where-the-symlink-should-point where-to-place-the-symlink-itself.
totymedli du
@Silvan, vous pouvez supprimer un lien symbolique via rm, mais la plupart des gens ne savent pas supprimer la fin /.
FreeSoftwareServers
288
ln -s EXISTING_FILE_OR_DIRECTORY SYMLINK_NAME
codaddict
la source
2
Mieux que la réponse acceptée et couvert d'une brièveté sans ambiguïté.
Josh Habdas
3
Sauf que ce n'est pas le nouveau nom du lien symbolique. Il s'agit du nom ou d'un chemin complet (relatif à dir dir ou absolu) du nouveau lien symbolique incluant le nom.
David Spector du
ln -s EXISTING_FILE_OR_DIRECTORY {chemin facultatif vers /} SYMLINK_NAME et ne placez pas de barre oblique de fin sur le lien symbolique, car ce n'est pas un répertoire
comfytoday
94
ln -s target linkName

Vous pouvez consulter la page de manuel ici:

http://linux.die.net/man/1/ln

rui
la source
6
bon de mentionner "cible" au lieu de simplement "fichier"
Alyas
88

(Parce qu'une image ASCII vaut mille caractères.)

Une flèche peut être un mnémonique utile, d'autant plus que c'est exactement à quoi elle ressemble dans le dir d'Emacs.

Et vue d'ensemble pour ne pas la confondre avec la version de Windows

Linux:

ln -s target <- linkName

Les fenêtres:

mklink linkName -> target

Vous pouvez également les considérer comme

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

Le from-herene devrait pas encore exister, il doit être créé, alors que le to-heredevrait déjà exister (IIRC).

(Je suis toujours mêlé à la question de savoir si diverses commandes et arguments doivent impliquer un emplacement préexistant ou un à créer.)

EDIT: Il s'enfonce toujours lentement pour moi; J'ai une autre façon que j'ai écrite dans mes notes.

ln -s (target exists) (link is made)
mklink (link is made) (target exists)
Brady Trainor
la source
Dans Emacs dired, c'est super facile, lorsque vous placez le curseur sur votre cible, appuyez sur Set tapez le répertoire dans lequel vous souhaitez créer le lien. Réduit l'écart entre imaginer le résultat souhaité et taper. Voir gnu.org/software/emacs/manual/html_node/emacs/… .
Brady Trainor
2
Mon mnémonique est ON: ln -s Original Newfile (lien symbolique)
robstarbuck
cela a fonctionné pour moi
Haider Ali
25
ln -s source_file target_file

http://unixhelp.ed.ac.uk/CGI/man-cgi?ln

Rob M
la source
4
c'est la définition opposée de "cible" par rapport à man ln, ce qui l'appelleln -s TARGET LINK_NAME
wisbucky
22

À la question d'origine:


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

Cela va en effet créer un lien symbolique ( -s) à partir du fichier / répertoire:

<basebuild>/IpDome-kernel/kernel

à votre nouveau lien

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

Voici quelques façons de vous aider à vous souvenir:

Tout d'abord, il y a la page de manuel pourln . Vous pouvez y accéder en recherchant "man ln" dans google, ou simplement ouvrir une fenêtre de terminal et taper man lnet vous obtiendrez les mêmes informations. La page de manuel indique clairement:

Dans [OPTION] ... [-T] TARGET LINK_NAME (1er formulaire)


Si devoir chercher ou lire une page de manuel à chaque fois n'est pas pour vous, vous aurez peut-être plus de facilité à vous souvenir que tout commandes nix fonctionnent de la même manière:

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

cp copie un fichier qui existe actuellement (le premier argument) dans un nouveau fichier (le deuxième argument).
mv déplace un fichier qui existe actuellement (le premier argument) vers un nouvel emplacement (le deuxième argument)

Lie également lnun fichier qui existe actuellement (le premier argument) à un nouveau lien (le deuxième argument) *


La dernière option que je voudrais suggérer est que vous pouvez créer vos propres pages de manuel qui sont faciles à lire et faciles (pour vous) à trouver / mémoriser. Créez simplement un script shell simple qui vous donne l'indication dont vous avez besoin. Par exemple :

Dans votre fichier .bash_aliases, vous pouvez placer quelque chose comme:

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

alias 'cmds'=commandsfx

Ensuite, lorsque vous en avez besoin, tapez simplement la ligne de commande cmdset vous récupérerez la syntaxe appropriée de manière à pouvoir la lire et la comprendre rapidement. Vous pouvez rendre ces fonctions aussi avancées que vous le souhaitez pour obtenir les informations dont vous avez besoin, c'est à vous de décider. Vous pouvez même les rendre interactifs, il vous suffit donc de suivre les instructions .. quelque chose comme:

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

alias 'symlink'=makesymlink

* - bien évidemment ils peuvent tous prendre des paramètres différents et faire des choses différentes et peuvent travailler sur des fichiers ainsi que des répertoires ... mais la prémisse est la même
♦ - exemples utilisant le shell bash

Mike
la source
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.
miku
la source
16

Création de liens symboliques ou de liens logiciels sous Linux:

Ouvrez l'invite Bash et tapez la commande mentionnée ci-dessous pour créer un lien symbolique vers votre fichier:

A) Allez dans le dossier où vous souhaitez créer un lien logiciel et tapez la commande comme mentionné ci-dessous :

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

B) Aller à votre chemin de nom de nouveau fichier et tapez :

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

Exemple:

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
Ankit Raj
la source
12

ln -s sourcepath linkpathname

Remarque:

-s crée des liens symboliques au lieu de liens physiques

simranjeet
la source
11

Si vous vous trouvez dans le répertoire où vous souhaitez créer un lien symbolique, ignorez le deuxième chemin.

cd myfolder
ln -s target

Il créera un lien symbolique de l' targetintérieurmyfolder .

Syntaxe générale

ln -s TARGET LINK_NAME
Fizer Khan
la source
11

C'est Stack Overflow donc je suppose que vous voulez du code:

Tout le code suivant suppose que vous souhaitez créer un lien symbolique nommé /tmp/linkqui renvoie vers /tmp/realfile.

ATTENTION : Bien que ce code vérifie les erreurs, il ne vérifie PAS s'il /tmp/realfileexiste réellement! En effet, un lien mort est toujours valide et en fonction de votre code, vous souhaiterez (rarement) créer le lien avant le fichier réel.


Shell (bash, zsh, ...)

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

Vraiment simple, tout comme vous le feriez sur la ligne de commande (qui est le shell). Toute la gestion des erreurs est effectuée par l'interpréteur de shell. Ce code suppose que vous disposez d'un interpréteur de shell fonctionnel sur/bin/sh .

Si nécessaire, vous pouvez toujours implémenter votre propre gestion des erreurs en utilisant le $? variable qui ne sera définie sur 0 que si le lien a été créé avec succès.

C et C ++

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

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

symlinkrenvoie uniquement 0 lorsque le lien peut être créé. Dans d'autres cas, j'utiliseperror pour en dire plus sur le problème.

Perl

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

Ce code suppose que vous avez un interpréteur perl 5 sur /usr/bin/perl. symlinkne renvoie 1 que si le lien peut être créé. Dans d'autres cas, j'imprime la raison de l'échec sur la sortie d'erreur standard.

Garo
la source
1
Explication ajoutée, également un avertissement pour les liens morts. Je ne vérifie pas cela, car on ne peut pas supposer que ce n'est pas voulu et aussi parce que les filetest ne sont plus sur le sujet
Garo
8

Je voudrais présenter une version plus simple en anglais des descriptions déjà présentées.

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

La commande "ln" crée un lien-FICHIER et le "-s" spécifie que le type de lien sera symbolique. Un exemple de fichier de lien symbolique peut être trouvé dans une installation WINE (en utilisant "ls -la" pour afficher une ligne du contenu du répertoire):

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

Les informations standard sur les fichiers sont à gauche (bien que le premier caractère soit un "l" pour "lien"); le nom du fichier est "a:" et le "->" indique également que le fichier est un lien. Il indique essentiellement à WINE comment le "lecteur A:" de Windows doit être associé à un lecteur de disquette sous Linux. Pour créer réellement un lien symbolique SIMILAIRE à celui-ci (dans le répertoire courant, et pour le faire pour WINE, c'est plus compliqué; utilisez l'utilitaire "winecfg"):

 ln -s  /mnt/floppy  a:   //will not work if file a: already exists
vernonner3voltazim
la source
7

Pour créer un lien symbolique / lien logiciel, utilisez:

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

par exemple:

ln -s file1 link1
Prem S
la source
4

Il y a deux types de liens:

liens symboliques: faire référence à un chemin symbolique indiquant l'emplacement abstrait d'un autre fichier

liens durs: reportez-vous à l'emplacement spécifique des données physiques.

Dans votre cas, les liens symboliques:

ln -s source target

vous pouvez vous référer à http://man7.org/linux/man-pages/man7/symlink.7.html

vous pouvez créer des liens trop durs

Un lien dur vers un fichier est impossible à distinguer de l'entrée de répertoire d'origine; toute modification apportée à un fichier est en fait indépendante du nom utilisé pour référencer le fichier. Les liens matériels ne font normalement pas référence à des répertoires et peuvent ne pas s'étendre sur les systèmes de fichiers.

ln source link
wpp
la source
4

Les liens sont essentiellement de deux types:

Liens symboliques (mous): lien vers un chemin symbolique indiquant l'emplacement abstrait d'un autre fichier

Liens physiques: lien vers l'emplacement spécifique des données physiques.

Exemple 1:

ln /root/file1 /root/file2

Ce qui précède est un exemple de lien dur où vous pouvez avoir une copie de vos données physiques.

Exemple 2:

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

La commande ci-dessus créera un lien symbolique vers file1.txt.

Si vous supprimez un fichier source, vous n'aurez rien vers la destination en soft.

Quand vous faites:

ls -lai

Vous verrez qu'il existe un numéro d'inode différent pour les liens symboliques.

Pour plus de détails, vous pouvez lire la page de manuel de ln sur votre système d'exploitation Linux.

Prabhat Singh
la source
hard link where you can have a copy of your physical data- Je pense que nous ne créons pas de copie des données physiques. Juste un autre nom pour les mêmes données physiques.
Alexander Radchenko
3

Je trouve un peu déroutant les terminologies "cible" et "répertoire" dans les informations man.

La cible est le dossier vers lequel nous faisons un lien symbolique et le répertoire le lien symbolique réel (pas le répertoire vers lequel vous allez effectuer un lien symbolique), si quelqu'un éprouve la même confusion, ne vous sentez pas seul.

Voici mon interprétation de la création d'un Symlink (sous Linux):

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

Vous pouvez accéder au dossier dans lequel vous souhaitez créer le lien symbolique et exécuter la commande ou spécifier le CHEMIN COMPLET pour votre lien symbolique au lieu de NOM-DE-VOTRE-SYMLINK.

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

OU

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

J'espère que cela aide ceux qui sont (encore) légèrement confus.

mmmdearte
la source
-2

Comment créer un lien symbolique dans vagabond. Pas:

  1. Dans un fichier vagabond, créez un dossier synchronisé. par exemple config.vm.synced_folder "F: / Sunburst / source / sunburst / lms", "/ source" F: / Sunburst / source / sunburst / lms: - où le code source, / source: - chemin du répertoire à l'intérieur du vagabond
  2. Vaguez et tapez vagrant ssh et allez dans le répertoire source, par exemple cd source
  3. Vérifiez que la structure de votre dossier de code source est disponible dans le répertoire source. par exemple / source / local
  4. Allez ensuite dans le répertoire de la machine invitée où se trouvent les fichiers associés au navigateur. Après avoir obtenu la sauvegarde du fichier. par exemple sudo mv local local_bk
  5. Créez ensuite un lien symbolique, par exemple sudo ln -s / source / local local. local signifie lien-nom (nom du dossier sur la machine invitée que vous allez lier) si vous devez supprimer le lien symbolique: - Tapez sudo rm local
Vayodya Tamari
la source