1.2.7. 链接

有两种方法把一个文件 “foo” 链接到一个不同的文件名 “bar”。

请参阅下面的示例,rm 命令结果中链接数的变化和细微的差别。

  1. $ umask 002
  2. $ echo "Original Content" > 1 foo
  3. $ ls -li foo
  4. 1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 foo
  5. $ ln foo bar # 硬链接
  6. $ ln -s foo baz # 符号链接
  7. $ ls -li foo bar baz
  8. 1449840 -rw-rw-r-- 2 penguin penguin 17 Oct 16 21:42 bar
  9. 1450180 lrwxrwxrwx 1 penguin penguin 3 Oct 16 21:47 baz -> 2 foo
  10. 1449840 -rw-rw-r-- 2 penguin penguin 17 Oct 16 21:42 foo
  11. $ rm foo
  12. $ echo "New Content" > 3 foo
  13. $ ls -li foo bar baz
  14. 1449840 -rw-rw-r-- 1 penguin penguin 17 Oct 16 21:42 bar
  15. 1450180 lrwxrwxrwx 1 penguin penguin 3 Oct 16 21:47 baz -> 4 foo
  16. 1450183 -rw-rw-r-- 1 penguin penguin 12 Oct 16 21:48 foo
  17. $ cat bar
  18. Original Content
  19. $ cat baz
  20. New Content

硬链接可以在同一个文件系统内创建,并共用同一个inode号,由ls(1)带 “-i”选项显示的。

符号链接总是名义上具有“rwxrwxrwx”的文件访问权限,如上面例子所示,实际的有效访问权限由它所指向的文件确定。

[小心]小心

除非你有非常好的理由,否则不要创建一个复杂的符号链接或硬链接通常是个好主意。符号链接的逻辑组合可能导致文件系统噩梦般的无限循环。

[注意]注意

通常使用符号链接比使用硬链接更合适,除非你有一个好理由使用硬链接。

.”目录链接到它所在的目录,因此任何新建目录的链接数从2开始。“..”目录链接到父目录,因此目录的链接数随着新的子目录的创建而增加。

如果你刚从Windows迁移到Linux,你很快将清楚 Unix 的文件名链接相较于Windows最相近的“快捷方式”是多么精心设计的。由于它是在文件系统中实现的,应用无法看到链接文件跟原始文件之间的区别。在硬链接这种情况,这真的是毫无差别。