Contents

如何建立目录的软链接

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