Как я могу символическую ссылку на файл в Linux? [закрыто]

1942

Я хочу сделать символическую ссылку в Linux. Я написал эту команду Bash, где первый путь - это папка, в которую я хочу перейти, а второй путь - это скомпилированный источник.

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

Это правильно?

chrissygormley
источник
Вы, вероятно, должны задать этот вопрос на unix.stackexchange.com
Guss
Может быть, superuser.com .
Джастин Лю

Ответы:

3680

Чтобы создать новую символическую ссылку (произойдет сбой, если символическая ссылка уже существует):

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

Чтобы создать или обновить символическую ссылку:

ln -sf /path/to/file /path/to/symlink
HSZ
источник
382
@micapam lnСинтаксис похож наcp синтаксис, например, источник назначения .
Андрей
157
Вот мнемосхема для вас: l (i) n (k) -s (ymbolic) <target> <необязательное имя> (тот факт, что последний параметр является необязательным, помогает понять, что он не является целью) (кстати, пропуская путь к символической ссылке создает ссылку в текущем каталоге с тем же базовым именем, что и у цели)
UncleZeiv
32
@micapam Так же, как cpесть CoPy,ln есть LiNk. Первые и третьи буквы.
Коул Джонсон
68
Я потратил несколько минут, пытаясь понять, почему это не работает для меня. Он создал зацикленную ссылку. Кажется, что / путь / к / файлу должен быть абсолютным и не относиться к «текущей папке». Возможно, укажите это в ответе?
Абхишек Ананд
52
@AbhishekAnand это было пару лет, но я просто хотел бы оставить записку , что делает работу с относительными путями; это просто должно быть относительно каталога результирующей символической ссылки, а не текущего каталога. То, что вы пишете в качестве первого аргумента пути, на самом деле, дословно, текст, который будет находиться внутри символической ссылки; Вот почему, когда оно относительно, оно должно быть относительно ссылки.
JoL
302
ln -s TARGET LINK_NAME

Где это -sделает это символично.

киборг
источник
2
TARGET & LINKNAME - лучший способ запомнить. Кстати, для удаления используйте символическую ссылку:unlink LINK_NAME
Сильван
31
Я хотел бы выразить это следующим образом: ln -s where-the-symlink-should-point where-to-place-the-symlink-itself.
тотемедли
@Silvan вы можете удалить символическую ссылку через rm, но большинство людей не знают, чтобы удалить трейлинг /.
FreeSoftwareServers
288
ln -s EXISTING_FILE_OR_DIRECTORY SYMLINK_NAME
codaddict
источник
2
Лучше, чем принятый ответ и покрытый однозначной краткостью.
Джош Хабдас
3
За исключением того, что это не новое имя символической ссылки. Это имя или полный путь (относительно cur dir или абсолютный) для новой символической ссылки, включая имя.
Дэвид Спектор
ln -s EXISTING_FILE_OR_DIRECTORY {необязательный путь к /} SYMLINK_NAME и не ставьте косую черту в символьную ссылку, так как это не каталог
comfytoday
94
ln -s target linkName

Вы можете взглянуть на справочную страницу здесь:

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

Руи
источник
6
хорошо упомянуть «цель» вместо просто «файл»
Alyas
88

(Потому что картинка ASCII стоит тысячи символов.)

Стрелка может быть полезной мнемоникой, тем более что она почти точно выглядит в Emacs'е.

И большая картинка, чтобы вы не перепутали ее с версией Windows

Linux:

ln -s target <- linkName

Окна:

mklink linkName -> target

Вы также можете посмотреть на них как

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

Не from-hereдолжно еще существовать, оно должно быть создано, а to-hereуже должно существовать (IIRC).

(Я всегда путаюсь, должны ли различные команды и аргументы включать уже существующее местоположение или одно из них должно быть сделано.)

РЕДАКТИРОВАТЬ: он все еще медленно погружается для меня; У меня есть другой способ, который я написал в своих заметках.

ln -s (target exists) (link is made)
mklink (link is made) (target exists)
Брейди Трейнор
источник
В Emacs ' diredэто очень просто: наведите курсор на цель, нажмите Sи введите каталог, в котором вы хотите создать ссылку. Сокращает разрыв между воображением желаемого результата и набором текста. См. Gnu.org/software/emacs/manual/html_node/emacs/… .
Брейди Трейнор
2
Моя мнемоника включена: ln -s Оригинальный Newfile (символическая ссылка)
robstarbuck
это сработало для меня
Хайдер Али
25
ln -s source_file target_file

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

Роб М
источник
4
это противоположное определение «цель» по сравнению с man ln, который называет этоln -s TARGET LINK_NAME
Wisbucky
22

На оригинальный вопрос:


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

Это действительно создаст символическую ссылку ( -s) из файла / каталога:

<basebuild>/IpDome-kernel/kernel

на вашу новую ссылку

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

Вот несколько способов помочь вам вспомнить:

Во-первых, есть справочная страница дляln . Вы можете получить доступ к этому через поиск "man ln" в Google, или просто откройте окно терминала и введите, man lnи вы получите ту же информацию. Справочная страница четко гласит:

ln [ОПЦИЯ] ... [-T] TARGET LINK_NAME (1-я форма)


Если вам каждый раз приходится искать или просматривать справочную страницу, возможно, вам будет легче вспомнить, что все команды nix работают одинаково:

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

cp копирует файл, который существует в данный момент (первый аргумент), в новый файл (второй аргумент).
mv перемещает существующий файл (первый аргумент) в новое место (второй аргумент)

Аналогично lnсвязывает файл, который существует в настоящее время (первый аргумент), с новой ссылкой (второй аргумент) *


Последний вариант, который я хотел бы предложить, - вы можете создавать свои собственные справочные страницы, которые легко читать и легко (для вас) найти / запомнить. Просто создайте простой сценарий оболочки, который даст вам подсказку, которая вам нужна. Например, :

В вашем файле .bash_aliases вы можете разместить что-то вроде:

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

alias 'cmds'=commandsfx

Затем, когда вам это нужно, просто введите в командной строке cmdsправильный синтаксис, чтобы вы могли быстро его прочитать и понять. Вы можете сделать эти функции настолько продвинутыми, насколько захотите, чтобы получить то, какая информация вам нужна, решать только вам. Вы даже можете сделать их интерактивными, так что вы просто должны следовать инструкциям .. что-то вроде:

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

alias 'symlink'=makesymlink

* - очевидно, что все они могут принимать разные параметры и делать разные вещи и могут работать как с файлами, так и с каталогами ... но предпосылка та же
♦ - примеры с использованием оболочки 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

Создание символических ссылок или Soft-ссылок в Linux:

Откройте приглашение Bash и введите указанную ниже команду, чтобы сделать символическую ссылку на ваш файл:

A) Перейдите в папку, в которой вы хотите создать программную ссылку, и введите команду, как указано ниже :

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

B) Перейдите к вашему новому имени файла и введите :

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

Пример:

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

Замечания:

-s делает символические ссылки вместо жестких ссылок

simranjeet
источник
11

Если вы находитесь в каталоге, где вы хотите создать символическую ссылку, игнорируйте второй путь.

cd myfolder
ln -s target

Это создаст символическую ссылку targetвнутри myfolder.

Общий синтаксис

ln -s TARGET LINK_NAME
Физер Хан
источник
11

Это переполнение стека, поэтому я предполагаю, что вы хотите код:

Весь следующий код предполагает, что вы хотите создать символическую ссылку с именем, на /tmp/linkкоторый ссылается /tmp/realfile.

ВНИМАНИЕ : Хотя этот код проверяет наличие ошибок, он НЕ проверяет, /tmp/realfileсуществует ли он на самом деле! Это связано с тем, что недействительная ссылка все еще действительна, и в зависимости от вашего кода вы можете (редко) захотите создать ссылку перед реальным файлом.


Оболочка (баш, зш, ...)

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

Очень просто, как вы бы это делали в командной строке (это оболочка). Вся обработка ошибок выполняется интерпретатором оболочки. Этот код предполагает, что у вас есть работающий интерпретатор оболочки в/bin/sh .

При необходимости вы все равно можете реализовать свою собственную обработку ошибок, используя $? переменную, которая будет установлена ​​на 0, только если ссылка была успешно создана.

C и C ++

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

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

symlinkвозвращает только 0, когда ссылка может быть создана. В других случаях я используюperror чтобы рассказать больше о проблеме.

Perl

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

Этот код предполагает, что у вас есть интерпретатор Perl 5 в /usr/bin/perl. symlinkвозвращает только 1, если ссылка может быть создана. В других случаях я печатаю причину ошибки на стандартный вывод ошибки.

Гаро
источник
1
Добавлено пояснение, а также предостережение о мертвых ссылках. Я не проверяю это, потому что нельзя предположить, что это не нужно, а также потому, что файловые тесты больше не обсуждаются
Garo
8

Я хотел бы представить более понятную английскую версию описаний, уже представленных.

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

Команда "ln" создает link-FILE, а "-s" указывает, что тип ссылки будет символическим. Пример файла символьной ссылки можно найти в установке WINE (используя «ls -la», чтобы показать одну строку содержимого каталога):

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

Стандартная информация о файле находится слева (хотя обратите внимание, что первый символ - это «l» для «ссылки»); имя файла - «a:», а «->» также указывает, что файл является ссылкой. Это в основном говорит WINE, как Windows «Drive A:» должна быть связана с гибким диском в Linux. Чтобы фактически создать символическую ссылку ПОХОЖУЮ на это (в текущем каталоге, и фактически сделать это для WINE более сложно; используйте утилиту "winecfg"):

 ln -s  /mnt/floppy  a:   //will not work if file a: already exists
vernonner3voltazim
источник
7

Чтобы создать символическую ссылку / мягкую ссылку, используйте:

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

например:

ln -s file1 link1
Прем С
источник
4

Есть два типа ссылок:

символические ссылки: Ссылка на символический путь, указывающий абстрактное местоположение другого файла.

жесткие ссылки: обратитесь к конкретному местоположению физических данных.

В вашем случае символические ссылки:

ln -s source target

вы можете обратиться к http://man7.org/linux/man-pages/man7/symlink.7.html

Вы можете создавать слишком жесткие ссылки

Жесткая ссылка на файл неотличима от исходной записи каталога; любые изменения в файле фактически не зависят от имени, используемого для ссылки на файл. Жесткие ссылки обычно не ссылаются на каталоги и могут не охватывать файловые системы.

ln source link
WPP
источник
4

Ссылки в основном бывают двух типов:

Символьные ссылки (мягкие): ссылка на символический путь, указывающий абстрактное местоположение другого файла

Жесткие ссылки: ссылка на конкретное местоположение физических данных.

Пример 1:

ln /root/file1 /root/file2

Выше приведен пример жесткой ссылки, где вы можете получить копию своих физических данных.

Пример 2:

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

Приведенная выше команда создаст символическую ссылку на file1.txt.

Если вы удалите исходный файл, у вас не будет ничего к месту назначения в программном обеспечении.

Когда вы делаете:

ls -lai

Вы увидите, что для символических ссылок есть другой номер инода.

Для получения более подробной информации вы можете прочитать справочную страницу ln в вашей ОС Linux.

Прабхат Сингх
источник
hard link where you can have a copy of your physical data- Я думаю, что мы не создаем копию физических данных. Просто другое имя для тех же физических данных.
Александр Радченко
3

Я нахожу немного запутывающим термины «цель» и «каталог» в информации о человеке.

Цель - это папка, на которую мы создаем символическую ссылку, и каталог фактической символической ссылки (а не каталог, на который вы будете ссылаться), если кто-то испытывает такую ​​же путаницу, не чувствуйте себя одиноким.

Это моя интерпретация создания Symlink (в Linux):

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

Вы можете перейти к папке, в которой вы хотите создать символическую ссылку, и выполнить команду или указать полный путь для символической ссылки вместо 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

ИЛИ

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

Я надеюсь, что это помогает тем (все еще) немного смущенным.

mmmdearte
источник
-2

Как создать символическую ссылку в vagrant. шаги:

  1. В бродячем файле создайте синхронизированную папку. например, config.vm.synced_folder "F: / Sunburst / source / sunburst / lms", "/ source" F: / Sunburst / source / sunburst / lms: - где исходный код, / source: - путь к каталогу внутри бродяги
  2. Vagrant up и введите vagrant ssh и перейдите в исходный каталог, например, cd source
  3. Убедитесь, что структура вашего исходного кода доступна в исходном каталоге. например / источник / местный
  4. Затем перейдите в каталог гостевой машины, где находятся файлы, связанные с браузером. После получите резервную копию файла. например, sudo mv local local_bk
  5. Затем создайте символическую ссылку, например, sudo ln -s / source / local local. local означает link-name (имя папки на гостевой машине, на которую вы собираетесь связать), если вам нужно удалить символическую ссылку: - Введите sudo rm local
Вайодья Тамари
источник