10分钟搞定硬链、软链
对于软链、硬链的内容整理,是为后续 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.js 和 sources/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
上述 .
为当前目录,可以通过此扩大或缩小查找范围。如果需要全局查找,可以设置为 /
。
上一篇: linux 软连接、硬连接与 ln(link) 命令
下一篇: 区块链中,软分叉硬分叉是什么。