为什么我的符号链接不起作用?


24

我正在尝试更好地理解符号链接...并且没有太多的运气。这是我的实际shell输出,其中用户名/主机已更改:

username@host:~$ mkdir actual
username@host:~$ mkdir proper
username@host:~$ touch actual/file-1.txt
username@host:~$ echo "file 1" > actual/file-1.txt
username@host:~$ touch actual/file-2.txt
username@host:~$ echo "file 2" > actual/file-2.txt
username@host:~$ ln -s actual/file-1.txt actual/file-2.txt proper
username@host:~$ # Now, try to use the files through their links
username@host:~$ cat proper/file-1.txt
cat: proper/file-1.txt: No such file or directory
username@host:~$ cat proper/file-2.txt
cat: proper/file-2.txt: No such file or directory
username@host:~$ # Check that actual files do in fact exist
username@host:~$ cat actual/file-1.txt
file 1
username@host:~$ cat actual/file-2.txt
file 2
username@host:~$ # Remove the links and go home :(
username@host:~$ rm proper/file-1.txt
username@host:~$ rm proper/file-2.txt

我认为符号链接应该透明地运行,从某种意义上讲,您可以像直接访问文件一样对指向的文件进行操作(当然rm,当然要删除该链接的情况除外))。


磁盘如何格式化?您正在使用什么文件系统?(FAT不支持符号链接,但是如果您尝试在FAT文件系统上建立链接,则应该给出错误。)
Nicole Hamilton

@NicoleHamilton-是ext4(根据df -T)-上面的结果对您来说也很奇怪吗?
orokusaki 2012年

@orokusaki并不奇怪。请参阅下面的答案。只需抬头,无需触摸文件即可接收文件。他们甚至不需要存在。只是为了节省您的打字时间!
nerdwaller 2012年

Answers:


50

符号链接倾向于喜欢完整路径或相对于链接的完整路径,否则它们通常可以在file-1.txt本地查找(足够多)。

导航到proper并执行ls -l,你可以看到符号链接正在寻找actual/file-1.txt,当它应该是../actual/file-1.txt

因此,您有两种选择:

  1. 给出完整的路径

    ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper
  2. 导航到您想要链接位于的文件夹,然后从那里链接

    cd proper
    ln -s ../actual/file-1.txt ../actual/file-2.txt ./

编辑:提示保存输入。

你可以做 ln -s ~/actual/file-{1,2}.txt ~/proper

花括号中的项目被替换并相互放置,创建命令

ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper

将两个文件都链接到目标目录。在外壳程序中继续学习时,可以节省一些主要的输入。


2
谢谢-在阅读您的答案之前,我正要拔头发。
orokusaki 2012年

1
有时肯定会令人困惑!Linux往往是非常文字化的,因此,如果您说做某事-它将。用符号链接文件夹时要小心,我之前已经覆盖了一两个(只需在名称后加上斜杠即可)。另外,请勿rm -rf *使用符号链接的文件夹-您可以擦除链接到的文件夹。只需执行rm symlinkname即可。我在:D上犯了一些错误
nerdwaller 2012年

3

问题是相对路径的使用。如果您使用完整的显式路径指定链接创建,那么它将起作用。

$ ln -s〜/ actual / file1.txt〜/ actual / file2.txt〜/ proper /

$猫适当/ file1.txt

文件1

$

您的示例在proper该链接中创建了一个链接,该链接在当前目录下查找一个名为“ actual”的子目录,而不是您想要的父目录。


1

符号链接可能很棘手。本质上,符号链接是一个文件,其中包含另一个文件的文件名/路径名(并标记为特殊处理)。如果链接文件中的路径名以“ /” 开头,那么它将被视为绝对路径名,并且事情相当简单。如果不是以斜杠开头,则将其视为相对路径名,即相对于链接所在目录的相对路径名。(无论名称中是否包含斜杠,都是如此。)因此,您将其创建proper/file–1.txt为“ actual/file–1.txt” 的链接,并且在尝试访问它时,系统尝试访问proper/actual/file–1.txt。你应该说

ln s  ../actual/file1.txt  ../actual/file2.txt  proper

顺便说一句,您不需要touch命令。  echo "file 1" > actual/file–1.txt足以创建actual/file–1.txt


0

一个相关的问题,对于许多人来说可能是显而易见的,但让我感到困扰了几分钟:如果要在本身是符号链接的目录中创建符号链接,或者在当前工作目录的路径中存在符号链接,则可能遇到符号链接不起作用的问题。

反复使用cd ..ls -l,以查看您的父目录本身是否是符号链接的。

如果需要创建符号链接,请到cd原始目标目录,然后在该目录中创建新的符号链接,以便相对路径准确。

或者换一种说法:相对路径是从原点到目标的路径。如果原点随后被符号链接,那就可以了。但是您可能会遇到问题,即在本身以某种方式符号链接的目录中设置新的Origin链接名称。


1
而不是“ cd ..ls -l反复”,你可以使用namei -mox $PWD。以找出是否有沿路径的符号链接另一个有用的方法是使用pwd -P,从而使您能够不包含任何符号链接(所以如果当前目录的路径pwd,并pwd -P给出不同的输出,你知道有沿途一个符号链接的地方)。
Ansa211

0

当您尝试创建一个不存在的文件的链接(或者您给路径指定不正确)时,ln -s不会引发错误。它创建了一个链接,但是当您在该链接上尝试“ cat”操作时,它说找不到文件。即使您可以使用ls看到它。在这种情况下,请始终仔细检查您的文件路径。

ubuntu@ip-172-31-80-155:~/lab5$ ln -s etc/ufw/ufw.conf link1
ubuntu@ip-172-31-80-155:~/lab5$ ls -al
total 5360
drwxrwxr-x 2 ubuntu ubuntu    4096 Mar  9 18:56 .
drwxr-xr-x 7 ubuntu ubuntu    4096 Mar  9 18:42 ..
-rwxr--r-- 1 ubuntu ubuntu 5478400 Mar  9 18:32 backup.tar
lrwxrwxrwx 1 ubuntu ubuntu      16 Mar  9 18:56 link1 -> etc/ufw/ufw.conf
ubuntu@ip-172-31-80-155:~/lab5$ cat link1
cat: link1: No such file or directory

因为文件etc / ufw / ufw.conf不存在。正确的路径是/etc/ufw/ufw.conf

ubuntu@ip-172-31-80-155:~/lab5$ ln -s /etc/ufw/ufw.conf link2
ubuntu@ip-172-31-80-155:~/lab5$ ls -l
total 5352
-rwxr--r-- 1 ubuntu ubuntu 5478400 Mar  9 18:32 backup.tar
lrwxrwxrwx 1 ubuntu ubuntu      16 Mar  9 18:56 link1 -> etc/ufw/ufw.conf
lrwxrwxrwx 1 ubuntu ubuntu      17 Mar  9 19:00 link2 -> /etc/ufw/ufw.conf
ubuntu@ip-172-31-80-155:~/lab5$ cat link2
# /etc/ufw/ufw.conf
#

# Set to yes to start on boot. If setting this remotely, be sure to add a rule
# to allow your remote connection before starting ufw. Eg: 'ufw allow 22/tcp'
ENABLED=no

# Please use the 'ufw' command to set the loglevel. Eg: 'ufw logging medium'.
# See 'man ufw' for details.
LOGLEVEL=low

已经有了一个更好的答案,第一部分是ln -s“有时”不检查目标的存在是错误的。
拉尔夫·弗里德尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.