ln
ln: hard link
ln,在两个文件间创建连接,默认为硬链接。
bash
# 创建一个硬链接 package.hard.json
$ ln package.json package.hard.json
# 此时 stat 查看 package.json,其 Links 为 2
$ stat package.json
File: package.json
Size: 7419 Blocks: 16 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 657204 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 1000/ shanyue) Gid: ( 1000/ shanyue)
Access: 2022-06-14 20:07:05.182595637 +0800
Modify: 2022-06-14 20:07:02.337546644 +0800
Change: 2022-06-18 21:19:50.885983756 +0800
Birth: 2022-06-14 19:10:22.779976895 +0800
# 此时 stat 查看 package.hard.json,其 Links 为 2,与源文件具有相同的 Inode
$ stat package.hard.json
File: package.hard.json
Size: 7419 Blocks: 16 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 657204 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 1000/ shanyue) Gid: ( 1000/ shanyue)
Access: 2022-06-14 20:07:05.182595637 +0800
Modify: 2022-06-14 20:07:02.337546644 +0800
Change: 2022-06-18 21:19:50.885983756 +0800
Birth: 2022-06-14 19:10:22.779976895 +0800# 创建一个硬链接 package.hard.json
$ ln package.json package.hard.json
# 此时 stat 查看 package.json,其 Links 为 2
$ stat package.json
File: package.json
Size: 7419 Blocks: 16 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 657204 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 1000/ shanyue) Gid: ( 1000/ shanyue)
Access: 2022-06-14 20:07:05.182595637 +0800
Modify: 2022-06-14 20:07:02.337546644 +0800
Change: 2022-06-18 21:19:50.885983756 +0800
Birth: 2022-06-14 19:10:22.779976895 +0800
# 此时 stat 查看 package.hard.json,其 Links 为 2,与源文件具有相同的 Inode
$ stat package.hard.json
File: package.hard.json
Size: 7419 Blocks: 16 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 657204 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 1000/ shanyue) Gid: ( 1000/ shanyue)
Access: 2022-06-14 20:07:05.182595637 +0800
Modify: 2022-06-14 20:07:02.337546644 +0800
Change: 2022-06-18 21:19:50.885983756 +0800
Birth: 2022-06-14 19:10:22.779976895 +0800在 stat 命令中,可发现硬链接文件与源文件:
- 其
Links变成了 2,Links代表硬链接的个数 - 具有相同的 Inode : 657204
- 具有相同的 Size 及属性
在前端使用了 pnpm 作为包管理工具的项目中,硬链接到处存在。
bash
# 以下操作在 React 源码目录中进行操作
# 进入 React 源码目录,通过 pnpm i 进行装包
# 使用 pnpm 作为前端依赖的项目中的硬链接
$ stat node_modules/.pnpm/react@17.0.2/node_modules/react/package.json
File: 'node_modules/.pnpm/react@17.0.2/node_modules/react/package.json'
Size: 777 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 2680331 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2022-06-22 17:47:53.434715185 +0800
Modify: 2022-06-22 17:47:09.079634810 +0800
Change: 2022-06-22 17:47:51.534626066 +0800
Birth: -# 以下操作在 React 源码目录中进行操作
# 进入 React 源码目录,通过 pnpm i 进行装包
# 使用 pnpm 作为前端依赖的项目中的硬链接
$ stat node_modules/.pnpm/react@17.0.2/node_modules/react/package.json
File: 'node_modules/.pnpm/react@17.0.2/node_modules/react/package.json'
Size: 777 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 2680331 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2022-06-22 17:47:53.434715185 +0800
Modify: 2022-06-22 17:47:09.079634810 +0800
Change: 2022-06-22 17:47:51.534626066 +0800
Birth: -ln -s : symbol link
ln -s : 在两个文件间创建符号链接,符号链接也被称为软链接。
bash
# 创建一个软链接
$ ln -s README.md README.soft.md
# 此时使用 stat 查看源文件
$ stat README.md
File: README.md
Size: 5201 Blocks: 16 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 657197 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ shanyue) Gid: ( 1000/ shanyue)
Access: 2022-06-18 21:02:40.466278536 +0800
Modify: 2022-06-17 11:29:45.580831556 +0800
Change: 2022-06-18 21:02:36.238205891 +0800
Birth: 2022-06-14 19:10:22.779976895 +0800
# 此时使用 stat 查看时,发现其变为了一个 symbolic link
$ stat README.soft.md
File: README.soft.md -> README.md
Size: 9 Blocks: 0 IO Block: 4096 symbolic link
Device: fd01h/64769d Inode: 666151 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2022-06-22 18:37:57.957044230 +0800
Modify: 2022-06-22 18:37:56.123012505 +0800
Change: 2022-06-22 18:37:56.123012505 +0800
Birth: 2022-06-22 18:37:56.123012505 +0800 ln -s Readme.md Readme.hard.md# 创建一个软链接
$ ln -s README.md README.soft.md
# 此时使用 stat 查看源文件
$ stat README.md
File: README.md
Size: 5201 Blocks: 16 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 657197 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ shanyue) Gid: ( 1000/ shanyue)
Access: 2022-06-18 21:02:40.466278536 +0800
Modify: 2022-06-17 11:29:45.580831556 +0800
Change: 2022-06-18 21:02:36.238205891 +0800
Birth: 2022-06-14 19:10:22.779976895 +0800
# 此时使用 stat 查看时,发现其变为了一个 symbolic link
$ stat README.soft.md
File: README.soft.md -> README.md
Size: 9 Blocks: 0 IO Block: 4096 symbolic link
Device: fd01h/64769d Inode: 666151 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2022-06-22 18:37:57.957044230 +0800
Modify: 2022-06-22 18:37:56.123012505 +0800
Change: 2022-06-22 18:37:56.123012505 +0800
Birth: 2022-06-22 18:37:56.123012505 +0800 ln -s Readme.md Readme.hard.md使用 stat 命令,可发现软链接文件与源文件
- 完全不同的 Inode ,证明是两个独立的文件
- 完全不同的 Size 及属性
- 在软链接文件中拥有 synbol link 标志
其中,软链接文件的 Size 为 9,实际上是它所指向的文件名的字节数。
软链接应用场景
- 在前端中,
npm link为node_modules中的某个 package 创建软链接至源码目录,方便调试 - 在前端中,
node_modules中某个 package 的package.json中的bin字段所指向的文件,会软链接至node_modules/.bin目录 - 在前端中,
npm i -g将某个 package 的bin字段所指向文件,软链接到$PATH目录下
Ayingotts's notes