如何建立目录的软链接
1. 概述
众所周知,在 Linux 命令行下,我们可以创建指向普通文件的链接 。有时,我们可能希望创建指向目录的链接。
在本快速教程中,我们将了解如何使用ln 命令执行此操作。
我们将专注于创建符号(软)链接 而不是硬链接。
2. 创建指向单个目录的链接
创建指向一个目录的链接是 ln命令的一个常见用例。语法与创建文件的软链接相同:
ln -s TARGET_DIR LINK_NAME
现在,让我们看看它的实际效果。让我们创建一个软链接*/tmp/test/linked_etc目录到目录/etc*:
$ ln -s /etc /tmp/test/linked_etc
$ stat /tmp/test/linked_etc
File: /tmp/test/linked_etc -> /etc
Size: 4 Blocks: 0 IO Block: 4096 symbolic link
Device: 30h/48d Inode: 46728 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 1000/ kent) Gid: ( 1000/ kent)
...
使用ln命令创建链接后 ,我们使用 stat 命令列出*/tmp/test/linked_etc*的详细信息。
在stat命令的输出中 ,我们可以看到符号链接已经创建成功。
如果我们不提供 LINK_NAME , ln 命令将在当前工作目录下创建一个带有目标目录名称的链接:
$ pwd
/tmp/test
$ ln -s /etc
$ stat /tmp/test/etc
File: /tmp/test/etc -> /etc
Size: 4 Blocks: 0 IO Block: 4096 symbolic link
Device: 30h/48d Inode: 46735 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 1000/ kent) Gid: ( 1000/ kent)
...
如示例所示,链接etc已在当前工作目录*/tmp/test* 下创建。
3. 创建指向多个目录的链接
我们已经了解了如何创建指向单个目录的链接。ln命令允许我们一次创建指向多个目标目录的链接。
现在,让我们看一下执行此操作的语法:
ln -s -t DIR_TO_CREATE_LINKS TARGET_DIR1 TARGET_DIR2 ...
像往常一样,让我们通过一个例子来了解命令是如何工作的。
假设我们要在 /tmp/test下创建两个软链接,指向 Java JDK 目录*/usr/lib/jvm/java-15-jdk和 Python 目录/usr/lib/python3.9*:
$ ln -s -t /tmp/test /usr/lib/jvm/java-15-jdk /usr/lib/python3.9
$ stat /tmp/test/java-15-jdk /tmp/test/python3.9
File: /tmp/test/java-15-jdk -> /usr/lib/jvm/java-15-jdk
Size: 24 Blocks: 0 IO Block: 4096 symbolic link
Device: 30h/48d Inode: 46771 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 1000/ kent) Gid: ( 1000/ kent)
...
File: /tmp/test/python3.9 -> /usr/lib/python3.9
Size: 18 Blocks: 0 IO Block: 4096 symbolic link
Device: 30h/48d Inode: 46772 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 1000/ kent) Gid: ( 1000/ kent)
...
如 上面的stat输出所示,这两个链接是在目录 /tmp/test下创建的,并指向所需的目标目录。
或者,我们可以以另一种形式创建指向多个目录的链接:
ln -s TARGET_DIR1 TARGET_DIR2 ... DIR_TO_CREATE_LINKS
这次,我们不使用 -t选项。相反,我们将DIR_TO_CREATE_LINKS目录放在参数列表的末尾。
示例始终是说明命令如何工作的好方法。
现在,让我们在新目录*/tmp/test2*下创建指向 Python 和 Java 目录的链接:
$ ln -s /usr/lib/jvm/java-15-jdk /usr/lib/python3.9 /tmp/test2
$ stat /tmp/test2/java-15-jdk /tmp/test2/python3.9
File: /tmp/test2/java-15-jdk -> /usr/lib/jvm/java-15-jdk
Size: 24 Blocks: 0 IO Block: 4096 symbolic link
Device: 30h/48d Inode: 46811 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 1000/ kent) Gid: ( 1000/ kent)
...
File: /tmp/test2/python3.9 -> /usr/lib/python3.9
Size: 18 Blocks: 0 IO Block: 4096 symbolic link
Device: 30h/48d Inode: 46812 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 1000/ kent) Gid: ( 1000/ kent)
...
stat输出告诉我们在 /tmp/test2下创建了两个链接。
4. 权限
到目前为止,我们已经了解到创建到目录的软链接是多么容易。
而且,如果我们仔细阅读stat命令的上述所有输出,我们会看到所有软链接的权限都是相同的:0777/lrwxrwxrwx。
我们应该记住,在 Linux 中,不使用符号链接的文件系统权限。权限始终为0777。
目标文件自身的权限控制着目标文件或目录的访问方式。
此外,如果我们更改软链接的权限,chmod命令会将更改转发到目标文件或目录。不管修改成功与否,软链接的权限还是0777。
让我们通过一个例子来理解它。
首先,让我们找到我们要链接的两个目录:
kent$ ls -ld /etc /home/kent/Desktop/aDirectory
drwxr-xr-x 131 root root 12288 Mar 26 11:07 /etc
drwxr-xr-x 2 kent kent 4096 Mar 26 23:23 /home/kent/Desktop/aDirectory
接下来,我们将在*/tmp/test3*目录下创建两个指向上述目录的链接:
kent$ ln -s /etc /home/kent/Desktop/aDirectory /tmp/test3
kent$ ls -l /tmp/test3/*
lrwxrwxrwx 1 kent kent 29 Mar 26 23:27 /tmp/test3/aDirectory -> /home/kent/Desktop/aDirectory/
lrwxrwxrwx 1 kent kent 4 Mar 26 23:27 /tmp/test3/etc -> /etc/
很好,我们已经创建了两个链接。最后,我们尝试将两个软链接的权限改为700:
kent$ chmod 700 /tmp/test3/etc
chmod: changing permissions of '/tmp/test3/etc': Operation not permitted
我们不能更改软链接*/tmp/test3/etc* 的权限。这是因为chmod命令会将权限更改应用到目标目录*/etc*。
显然,作为普通用户“ kent ” ,我们无权更改*/etc*的权限 。
接下来,让我们看看如果我们更改另一个链接的权限会发生什么:
kent$ chmod 700 /tmp/test3/aDirectory
kent$ ls -ld /home/kent/Desktop/aDirectory
drwx------ 2 kent kent 4096 Mar 26 23:23 /home/kent/Desktop/aDirectory/
如输出所示,目标目录*/home/kent/Desktop/aDirectory*的权限已从“ drwxr-xr-x ”更改为“ drwx—— ”。
最后我们看看这两个chmod命令会不会影响两个软链接的权限:
kent$ ls -l /tmp/test3/*
lrwxrwxrwx 1 kent kent 29 Mar 26 23:27 /tmp/test3/aDirectory -> /home/kent/Desktop/aDirectory/
lrwxrwxrwx 1 kent kent 4 Mar 26 23:27 /tmp/test3/etc -> /etc/
因此,我们无法更改软链接的权限——它始终是777。