对于软链、硬链的内容整理,是为后续 pnpm 的内容做准备。

示例:

cd /Users/ligang/Documents/github/practice/links/sources
# 在测试目录下创建相应的测试文件
touch test.js && echo "console.log('links')" > test.js

inode

查看文件信息(inode)

ls -li test.js
8643193659 -rw-r--r-- 1 ligang staff 21 8 30 17:08 test.js

inode值

文件类型权限

链接计数

文件拥有者

文件群组

大小

修改日期

名称

8643193659

-rw-r–r--

1

ligang

staff

21

8 30 17:08

test.js

inode 为“索引节点”,存储文件的元信息。其是 UNIX 操作系统中的一种数据结构,包含了与文件系统中各个文件相关的一些重要信息。

hard links (硬链)

创建硬链

ln ./sources/test.js test-hard-links.js

查看文件信息(inode)

ls -li test-hard-links.js
8643193659 -rw-r--r-- 2 ligang staff 21 8 30 17:08 test-hard-links.js

其同原文件的 inode 值相同,指向了物理硬盘的一个区块。

向 test-hard-links.js 追加内容

echo "console.log('test hard links')" >> test-hard-links.js
cat sources/test.js

console.log('links')
console.log('test hard links')

原文件 test.js 同步更新了内容。

删除原文件 test.js

rm sources/test.js
cat test-hard-links.js

console.log('links')
console.log('test hard links')

通过硬链的文件不受影响。

再次向 test-hard-links.js 写内容(原文件已删除)

echo "console.log('test hard links again')" >> test-hard-links.js
ll sources/test.js

ls: sources/test.js: No such file or directory

只会向 test-hard-links.js 写入,原文件已删除不会做任何处理

soft/symbolic links (软链)

创建软链

ln -s sources/test.js test-soft-links.js

查看文件信息(inode)

ls -li test-soft-links.js
8643223807 lrwxr-xr-x 1 ligang staff 15 8 31 13:27 test-soft-links.js -> sources/test.js

其同原文件的 inode 值不同。

向 test-soft-links.js 追加内容

echo "console.log('soft hard links')" >> test-soft-links.js
cat sources/test.js

console.log('links')
console.log('soft hard links')

原文件 test.js 同步更新了内容。

删除原文件 test.js

rm sources/test.js
cat test-soft-links.js

cat: test-soft-links.js: No such file or directory

报错!没有相应的文件或目录。

再次向 test-soft-links.js 写内容(原文件已删除)

echo "console.log('test soft links again')" >> test-soft-links.js
ll sources/test.js

-rw-r--r-- 1 ligang staff 37B 8 31 13:35 sources/test.js

cat sources/test.js
cat test-soft-links.js

console.log('test soft links again')

只会向 test-hard-links.js 写入,原文件重新被创建,且 test-soft-links.jssources/test.js 内容都变成了最新修改内容(同 sources/test.js 保持一致)。

区别

硬链为文件内容创建别名;软链为文件名创建别名。

hard links(硬链)

symbolic links(软链)

执行命令

​ln​

​ln -s​

inode

同原文相同(是原始文件的附加名称

同原文不同(是原始文件的别名

原始文件被删除

仍然有效

无效

文件系统

仅限于原始文件文件系统(不能跨文件系统)

可以跨不同的文件系统

链接目录

不支持

支持

创建硬链接实际上是为原文件在存储器中的资源再新建一个入口,所以硬链接和原文件指向的其实是储存器中的同一处资源(同一个 inode);而软链接建立的是一个指向,即链接文件内的内容是指向原文件的指针,它们是两个文件。

补充-查看硬链的文件

ln sources/test.js test-hard-links.js
ll -li sources/test.js

8643224333 -rw-r--r-- 2 ligang staff 37B 8 31 13:36 sources/test.js

根据上述阐述,链接计数为2,如何查看呢?

方式一:寻找相同的 inode

find . -inum 8643224333

./test-hard-links.js
./sources/test.js

方式二:寻找相同的 filename

find . -samefile ./sources/test.js

./test-hard-links.js
./sources/test.js

上述 ​​.​​​ 为当前目录,可以通过此扩大或缩小查找范围。如果需要全局查找,可以设置为 ​​/​​。