如何在 Linux 中符号链接文件?[已结束]

How can I symlink a file in Linux? [closed]

提问人:chrisg 提问时间:12/23/2009 最后编辑:Peter Mortensenchrisg 更新时间:7/30/2020 访问量:2208957

问:


这个问题似乎不是关于特定的编程问题、软件算法或程序员主要使用的软件工具。如果您认为该问题在另一个 Stack Exchange 站点上是主题,您可以发表评论以解释该问题可能在哪里得到回答。

4年前关闭。

我想在 Linux 中创建一个符号链接。我编写了这个 Bash 命令,其中第一个路径是我要链接到的文件夹,第二个路径是编译的源代码。

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

这是正确的吗?

Linux 符号链接

评论

1赞 Guss 4/16/2020
你可能应该在 unix.stackexchange.com 问这个问题
1赞 Justin Liu 6/6/2020
也许 superuser.com
0赞 David Ferenczy Rogožan 10/14/2021
下次,先试试。这是一种更快、更简单的找到答案的方法。man ln

答:

4041赞 hsz 12/23/2009 #1

要创建新的符号链接(如果符号链接已存在,则失败):

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

要创建或更新符号链接:

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

评论

427赞 Andrey 4/7/2014
@micapam 语法与语法类似,例如目标lncp
175赞 UncleZeiv 5/22/2014
这里有一个助记符: l(i)n(k) -s(ymbolic) <target> <可选名称> (最后一个参数是可选的这一事实可以帮助您确定它不是目标)(顺便说一句,省略符号链接的路径会在当前目录中创建一个与目标具有相同基名的链接)
39赞 Cole Tobin 8/16/2014
@micapam 就像是 一样 。第一个和第三个字母。cpCoPylnLiNk
79赞 Abhishek Anand 5/24/2015
我花了几分钟试图弄清楚为什么这对我不起作用。它创建了一个自循环链接。似乎 /path/to/file 应该是绝对的,而不是相对于“当前文件夹”。也许在答案中指出这一点?
62赞 JoL 3/27/2017
@AbhishekAnand已经有几年了,但我只是想留下一个注释,它确实适用于相对路径;它只需要相对于生成的符号链接的目录,而不是当前目录。你写的第一个路径参数实际上是逐字的,将在符号链接内的文本;这就是为什么当它是相对的时,它必须是相对于链接的。
99赞 rui 12/23/2009 #2
ln -s target linkName

您可以在此处查看手册页:

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

评论

7赞 Alyas 4/15/2016
值得一提的是“目标”,而不仅仅是“文件”
336赞 cyborg 12/23/2009 #3
ln -s TARGET LINK_NAME

使它具有象征意义的地方。-s

评论

4赞 Silvan 7/6/2017
TARGET和LINKNAME是更好的记忆方式。顺便说一句,删除符号链接使用:unlink LINK_NAME
45赞 totymedli 3/14/2018
我喜欢这样说:.ln -s where-the-symlink-should-point where-to-place-the-symlink-itself
0赞 FreeSoftwareServers 11/6/2018
@Silvan您可以通过 删除符号链接,但大多数人不知道删除尾随 。rm/
19赞 miku 12/23/2009 #4
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.
326赞 codaddict 12/23/2009 #5
ln -s EXISTING_FILE_OR_DIRECTORY SYMLINK_NAME

评论

8赞 vhs 8/7/2018
比公认的答案更好,并且简洁明了。
4赞 David Spector 9/16/2018
除了它不是新的符号链接名称。它是包含名称的新符号链接的名称或完整路径(相对于 cur、dir 或绝对)。
1赞 atlas_scoffed 7/11/2019
ln -s EXISTING_FILE_OR_DIRECTORY {可选路径/}SYMLINK_NAME,不要在符号链接上加上尾部斜杠,因为它不是目录
0赞 Y Y 8/27/2021
比@cyborg的答案更好,更容易理解
25赞 Rob M 10/14/2013 #6
ln -s source_file target_file

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

评论

4赞 wisbucky 3/25/2017
与 相比,“目标”的定义与 相反,后者称其为man lnln -s TARGET LINK_NAME
8赞 vernonner3voltazim 4/4/2014 #7

我想介绍一下已经提出的描述的更通俗易懂的英文版本。

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

“ln”命令创建一个链接文件,“-s”指定链接的类型将是符号的。符号链接文件的示例可以在 WINE 安装中找到(使用“ls -la”显示一行目录内容):

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

标准的文件信息内容在左边(但请注意,第一个字符是“链接”的“l”);文件名为“a:”,“->”也表示该文件是链接。它基本上告诉 WINE 如何将 Windows“驱动器 A:”与 Linux 中的软盘驱动器相关联。要实际创建一个与此类似的符号链接(在当前目录中,并且实际为 WINE 执行此操作更为复杂;请使用“winecfg”实用程序):

 ln -s  /mnt/floppy  a:   //will not work if file a: already exists
11赞 Fizer Khan 4/16/2014 #8

如果您位于要创建符号链接的目录中,请忽略第二个路径。

cd myfolder
ln -s target

它将创建内部的符号链接。targetmyfolder

一般语法

ln -s TARGET LINK_NAME
98赞 Brady Trainor 5/6/2014 #9

(因为一张 ASCII 图片胜过一千个字符。

箭头可能是一个有用的助记符,特别是因为它几乎完全是 Emacs 的 dired 中的样子。

而且大局观,所以你不会把它与Windows的版本混淆

Linux操作系统:

ln -s target <- linkName

窗户:

mklink linkName -> target

你也可以把这些看作是

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

应该还不存在,它将被创建,而应该已经存在 (IIRC)。from-hereto-here

(我总是混淆各种命令和参数是否应该涉及预先存在的位置,或者应该创建一个位置。

编辑:对我来说,它仍在慢慢沉入;我在笔记中还有另一种写法。

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

评论

0赞 Brady Trainor 8/2/2014
在 Emacs 中,这非常简单,因为您将光标放在目标上,按 ,然后键入要创建链接的目录。缩短想象所需结果和键入之间的差距。请参阅 gnu.org/software/emacs/manual/html_node/emacs/...diredS
4赞 robstarbuck 7/29/2016
我的助记词是 ON: ln -s Original Newfile (符号链接)
0赞 Haider Ali 4/16/2018
这对我有用
0赞 Mauricio Poppe 6/3/2021
ON: 的另一个助记词,这些词在 Go OS 库中也使用 golang.org/pkg/os/#Symlinkln -s oldname newname
22赞 Mike 8/6/2014 #10

对于原始问题:


'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”来访问它,或者只需打开终端窗口并输入,您将获得相同的信息。手册页明确指出:man ln

ln [选项]...[-T]TARGET LINK_NAME(第一形式)


如果每次都必须搜索或通读手册页并不适合您,也许您会更容易记住所有 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 将当前存在的文件(第一个参数)链接到新链接(第二个参数)

*


我想建议的最后一个选项是,您可以创建自己的手册页,这些手册页易于阅读且易于(对您而言)查找/记忆。只需制作一个简单的 shell 脚本,即可为您提供所需的提示。例如

在您的 .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 shell 的示例

12赞 simranjeet 5/11/2015 #11

ln -s sourcepath linkpathname

注意:

-s 创建符号链接而不是硬链接

-2赞 Vayodya Tamari 2/15/2016 #12

如何在流浪者中创建符号链接。 步骤:

  1. 在 vagrant 文件中创建一个同步文件夹。例如config.vm.synced_folder “F:/Sunburst/source/sunburst/lms”, “/source” F:/Sunburst/source/sunburst/lms :- 其中源码,/source :- 流浪者内部的目录路径
  2. Vagrant up 并键入 vagrant ssh 并转到源目录,例如 cd source
  3. 验证源代码文件夹结构在源目录中是否可用。例如 /source/local
  4. 然后转到与浏览器关联的文件的来宾计算机目录。获取文件备份后。例如 sudo mv 本地local_bk
  5. 然后创建符号链接,例如 sudo ln -s /source/local local。本地平均链接名称(要链接的客户机中的文件夹名称) 如果您需要删除符号链接:- 键入 sudo rm local
19赞 Ankit Raj 11/7/2016 #13

在 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
4赞 wpp 6/28/2017 #14

有两种类型的链接:

符号链接:引用指示另一个文件的抽象位置的符号路径

硬链接:指物理数据的具体位置。

在您的例子中,符号链接:

ln -s source target

您可以参考 http://man7.org/linux/man-pages/man7/symlink.7.html

您可以创建太硬的链接

指向文件的硬链接与原始目录条目无法区分;对文件的任何更改实际上都与用于引用文件的名称无关。硬链接通常不引用目录,也可能不跨越文件系统。

ln source link
7赞 Prem S 7/11/2017 #15

若要创建符号链接/软链接,请使用:

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

例如:

ln -s file1 link1
4赞 mmmdearte 11/16/2017 #16

我发现人员信息中的术语“目标”和“目录”有点令人困惑。

目标是我们正在符号链接到的文件夹和实际符号链接的目录(不是您将符号链接到的目录),如果有人遇到同样的困惑,请不要感到孤独。

这是我对创建符号链接(在 linux 中)的解释:

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

您可以导航到要创建符号链接的文件夹并运行命令,或者指定符号链接的 FULL PATH 而不是 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

我希望这对那些(仍然)有点困惑的人有所帮助。

12赞 Garo 2/2/2018 #17

这是 Stack Overflow,所以我假设你想要代码:

以下所有代码都假定您要创建一个名为 的符号链接,该链接链接到 。/tmp/link/tmp/realfile

注意:虽然此代码会检查错误,但它不会检查是否真的存在!这是因为死链接仍然有效,并且根据您的代码,您可能(很少)希望在真实文件之前创建链接。/tmp/realfile


外壳 (bash, zsh, ...)

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

真的很简单,就像你在命令行(即 shell)上执行的操作一样。所有错误处理都由 shell 解释器完成。此代码假定您在 中有一个有效的 shell 解释器。/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 解释器。 如果可以创建链接,则仅返回 1。在其他情况下,我将失败原因打印到标准错误输出中。/usr/bin/perlsymlink

评论

1赞 Garo 2/2/2018
添加了解释,也是对死链接的警告。我没有检查这个,因为不能假设这不是不需要的,也因为文件测试不再是主题
5赞 Prabhat Singh 12/6/2018 #18

链接基本上有两种类型:

符号链接(软):链接到指示另一个文件的抽象位置的符号路径

硬链接:指向物理数据的具体位置的链接。

示例 1:

ln /root/file1 /root/file2

以上是一个硬链接示例,您可以在其中获得物理数据的副本。

示例 2:

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

上面的命令将创建一个指向 file1.txt 的符号链接。

如果删除源文件,则不会有任何内容到达目标。

当您执行以下操作时:

ls -lai

您将看到符号链接有不同的 inode 编号。

有关更多详细信息,您可以在 Linux 操作系统上阅读 ln 的手册页。

评论

0赞 Alexander Radchenko 9/3/2019
hard link where you can have a copy of your physical data- 我认为我们不创建物理数据的副本。只是相同物理数据的另一个名称。