1
2
3
cd /home/sosactwt
ls
公共 模板 视频 图片 文档 下载 音乐 桌面 anaconda3 vscode

我们在里面放上各种文件。

1
2
3
4
5
6
7
8
9
10
11
cd vscode
ls
a1 cpp file1 first p.py
a.out cpp_s file1_symnoliclink first.cpp
ls -l
-rwxrwxrwx. 2 sosactwt sosactwt 21136 2月 19 12:33 a.out
drwxrwxrwx. 1 sosactwt sosactwt 46 2月 22 18:15 cpp
-rw-rw-r--. 2 sosactwt sosactwt 0 2月 22 18:08 file1
-rwxrwxrwx. 1 sosactwt sosactwt 38224 2月 19 12:30 first
-rw-rw-rw-. 1 sosactwt sosactwt 94 2月 19 12:27 first.cpp
-rwxrwxrwx. 1 sosactwt sosactwt 0 2月 20 00:07 p.py

下面的叙述皆基于此

pwd 与 软硬连接

【硬连接】

硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除(当然了原文件肯定也要删除才算删干净啦)。
硬连接的2个限制:

  • 不允许给目录创建硬链接
  • 只有在同一文件系统中的文件之间才能创建链接。 即不同硬盘分区上的两个文件之间不能够建立硬链接。这是因为硬链接是通过结点指向原始文件的,而文件的结点在不同的文件系统中可能会不同。
1
2
3
4
5
6
7
8
9
10
11
#vscode 目录下
ln file1 file1_hardlink #创建file1的硬连接
ls -l
-rwxrwxrwx. 2 sosactwt sosactwt 21136 2月 19 12:33 a.out
drwxrwxrwx. 1 sosactwt sosactwt 46 2月 22 18:15 cpp
-rw-rw-r--. 2 sosactwt sosactwt 0 2月 22 18:08 file1
-rw-rw-r--. 2 sosactwt sosactwt 0 2月 22 18:08 file1_hardlink#在这里
-rwxrwxrwx. 1 sosactwt sosactwt 38224 2月 19 12:30 first
-rw-rw-rw-. 1 sosactwt sosactwt 94 2月 19 12:27 first.cpp
-rwxrwxrwx. 1 sosactwt sosactwt 0 2月 20 00:07 p.py

【软连接】

另外一种连接称之为符号连接(Symbolic Link),也叫软连接。

软链接文件类似于Windows的快捷方式。它实际上是一个特殊的文件。

在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

因此可以从下面看到,硬连接和软连接的大小是不一样的,硬连接与原文件大小和节点信息都一样,而软连接的大小则只是一个文本文件的大小。

这就允许符号链接(经常简写为symlinks)指向位于其他分区、甚至是其他硬盘上的某个文件

1
2
3
ln -s file1 file1_symboliclink #创建file1的软连接(符号连接)
ls -li # ls -i 查看文件的inode号(inode存储文件的详细信息),即开头那个数字

我们同样也创建一个a.out文件的硬连接a_hardlink,软连接a_symboliclink,以及 目录(文件夹)cpp的软连接cpp_s,我们不能对目录创建硬连接。最后如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
102577 -rwxrwxrwx. 2 sosactwt sosactwt 21136  2月 19 12:33 a_hardlink
102577 -rwxrwxrwx. 2 sosactwt sosactwt 21136 2月 19 12:33 a.out
110906 lrwxrwxrwx. 1 sosactwt sosactwt 5 2月 22 18:54 a_symboliclink -> a.out
104775 drwxrwxrwx. 1 sosactwt sosactwt 46 2月 22 18:15 cpp
110826 lrwxrwxrwx. 1 sosactwt sosactwt 3 2月 22 18:19 cpp_s -> cpp
110797 -rw-rw-r--. 3 sosactwt sosactwt 0 2月 22 18:08 file1
110797 -rw-rw-r--. 3 sosactwt sosactwt 0 2月 22 18:08 file1_hardlink
110805 lrwxrwxrwx. 1 sosactwt sosactwt 5 2月 22 18:12 file1_symnoliclink ->file1
99486 -rwxrwxrwx. 1 sosactwt sosactwt 38224 2月 19 12:30 first
99040 -rw-rw-rw-. 1 sosactwt sosactwt 94 2月 19 12:27 first.cpp
110907 lrwxrwxrwx. 1 sosactwt sosactwt 1 2月 22 18:54 k -> k#(*)
105514 -rwxrwxrwx. 1 sosactwt sosactwt 0 2月 20 00:07 p.py

再来看

1
2
3
4
5
6
(base) [sosactwt@localhost vscode]$ ln file1 file1
ln: 无法创建硬链接 'file1': 文件已存在

(base) [sosactwt@localhost vscode]$ ln -s file1 file1
ln: 无法创建符号链接 'file1': 文件已存在

可见我们没有办法直接为file1的连接取一个一样名字的连接
但是却可以对不存在的文件如下

1
2
ln -s k k #具体作用存疑🤨
#即上面列出的(*),凭空创建了一个软连接文件,但是如果我们想要访问,他便会显示找不到k的原始项目

但是我们却不能用硬连接命令这样做,

1
2
ln -s j j
ln: 访问j失败:没有那个文件或目录

pwd [-LP] 显示目前所在的目录

因为pwd是用来显示目录的,所用我们用cpp_s来做试验。

1
2
3
4
5
6
7
cd cpp_s
pwd
/home/sosactwt/vscode/cpp_s
pwd -L
/home/sosactwt/vscode/cpp_s
pwd -P
/home/sosactwt/vscode/cpp

pwd默认采用pwd -L ,即当前工作路径 ,

但由于cpp_s是连结档,即目录cpp的软连接(如上面所示cpp_s -> cpp),故其路径与cpp的路径不一致

而pwd -P 则是撇开连结档的干扰,打印出原目录的路径