欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

10分钟搞定硬链、软链

程序员文章站 2024-02-27 16:19:57
...

对于软链、硬链的内容整理,是为后续 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

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