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

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

我正在尝试更好地理解符号链接……但运气不佳。这是我更改用户名/主机后的实际 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简单地删除链接的情况)。

答案1

符号链接倾向于喜欢完整路径或相对于链接,否则它们通常可以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
    

它将两个文件链接到目标目录。当您在 shell 中进一步操作时,可以节省一些主要的输入工作。

答案2

问题在于相对路径的使用。如果您使用完整显式路径指定链接创建,则它可以工作。

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

$ cat 适当的/file1.txt

文件 1

$

您的示例创建了链接,proper查找当前目录下名为实际的子目录,而不是您想要的父目录。

答案3

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

ln –s  ../actual/file–1.txt  ../actual/file–2.txt  proper

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

答案4

当您尝试创建指向不存在的文件的链接(或者您给出的路径不正确)时,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

相关内容