我正在尝试更好地理解符号链接……但运气不佳。这是我更改用户名/主机后的实际 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
。
因此你有两个选择:
给出完整路径
ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper
导航到您想要链接的文件夹并从那里链接
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