如果这对任何人都有帮助:我已经习惯将其视为“ln what where ”,这有助于我记住第一个参数(“what”)是现有文件,第二个参数(“where”)是位置放置(链接)它。与大多数其他答案中的推理相反,这只不过是一个简洁的短语,我可以在输入命令时在心里背诵它,作为记忆辅助。这可能对每个人都没有用,但我怀疑它会对某些人有所帮助。
mv A B --- move the whole file to B (dir or new name)
cp A B --- copy whole file (mv and cp are "the same" here)
ln A B --- copy whole file MINUS data blocks (=copy only inode and name), and increase "link count" for track keeping
mov %eax, %ebx ;; AT&T style assembler syntax: %ebx register gets value of %ecx
mv foo bar ;; foo renamed to bar
cp foo bar ;; contents of foo go to bar
foo | bar ;; data moves left to right in pipeline
ln abc def ;; link to abc installed as def
我通过“
ln
就像cp
。'来源'需要先出现。”我使用以下内容:
ln
有一个单参数形式(手册页中列出的第二种形式),其中只需要目标(因为ln
在不知道目标的情况下如何工作)并ln
在当前目录中创建链接。双参数形式是单参数形式的补充,因此目标始终是第一个参数。大多数 Unices 将
ln
命令记录为(我在这里省略了选项等)
例子:
POSIX 标准
开放式系统:
NetBSD和FreeBSD
苹果系统
索拉里斯
艾克斯
GNU
ln
手册很奇怪,它调用了source
target和target
linkname。GNU 手册
ln
忽略 GNU 的单词选择,该
ln
实用程序遵循与例如相同的语义,因为mv
目标cp
是从源创建的。所以,
b
将创建指向的符号链接a
。或者换句话说,b
是创建符号链接的操作的目标,a
用作源。请注意,在创建符号链接时,源只是一个字符串,表示符号链接应指向的内容。通常不会进行检查以验证它是否指向任何有用的东西:
关于 GNU 选择使用“目标”和“链接名称”而不是“源”后跟“目标”的个人想法:
很明显,第二个参数,即创建的东西,应该是“链接名称”,而第一个参数,链接的目标,是“目标”。但是,仅当您使用该链接时,这才是正确的。
当您创建链接时,这就是您正在做
ln
的事情,第二个参数,即创建的东西,是ln
操作的“目标”,它是使用第一个参数“源”创建的。这与其他基本工具的参数的类似“源”->“目标”顺序一起,使得非 GNU 文档
ln
看起来更自然。我最近听到了一种记住这件事的好方法:押韵
第一段是 ln 的参数是什么:一些旧的,然后是新目录条目的名称。
如果这对任何人都有帮助:我已经习惯将其视为“ln what where ”,这有助于我记住第一个参数(“what”)是现有文件,第二个参数(“where”)是位置放置(链接)它。与大多数其他答案中的推理相反,这只不过是一个简洁的短语,我可以在输入命令时在心里背诵它,作为记忆辅助。这可能对每个人都没有用,但我怀疑它会对某些人有所帮助。
它有助于其他标准文件操作命令使用相同的约定,因此我可以对
cp
and执行相同的操作mv
。从 1971 年的Unix 第一版手册。
还有第二种简单的语法形式。
我用 FILE 或 FILENAME 代替 TARGET --- 见评论等。另见底部很长的补充,解决 冰山,硬和软,
ln
而不仅仅是冰山一角。所以 GNU
ln
有这个:您不需要链接名称的地方。在
ln -s /usr/lib/modules
你得到一个与 FILENAME 同名(“目标”或“源”),就在您所在的位置。没有选择,没有困惑。
现在,如果您要求更高并希望在另一个名称和/或其他地方创建链接,您可以将该愿望添加为名称或路径。真正的目标是第一,额外的花哨的新链接名称第二。
或者你说:“我知道链接中的这个箭头符号
ls -l
。我在外壳中没有箭头来显示链接的方向。所以我必须把它转过来。”你在一个方向上创建它,所以你可以在另一个方向上使用它。
(回答问题部分结束)
在另一个层面上,“链接”这个词本身就具有深藏不露的双重含义。符号链接是后来出现的,所以在早期,链接只是一个链接。没有软硬之分,没有
-s
选择。现在我什至使用源-目标符号:在这个阶段,有链接,但没有硬和软,
ls -l
也不显示箭头,因为(硬)链接没有方向。在 unix 演化的那个阶段,“链接”意味着文件系统中的文件名“B”(目录条目“B”)指向与文件名“A”指向的相同 inode。文件 A 和 B 被“链接”在一起,因为它们共享相同的块。所以现在每一个
rm
,内核必须检查:我是删除/释放磁盘上这个文件的块,还是有另一个文件链接到相同的块?为此,使用了链接计数器。假设您想保留 /tmp 上的一个大文件不被删除,然后执行
ln /tmp/bigfile
. 现在您的工作目录中有一个大文件。在清理 /tmp 并删除“原始”之后,您可以愉快地继续使用相同的数据块。你没有死链接或悬空链接,你有一个正常的文件。像每个 dir 条目一样,不指向文件,而只指向文件系统块。只是现在“清理”/tmp 不像以前那么有效了。它看起来是空的,但分区上的块并没有被释放。即使硬链接本身不会占用空间
cp
,它也可以间接地占用空间。添加
ln -s
到上面的序列:现在,软链接“B”只有一个带有路径名的字符串。这是“软”信息。从技术上讲,“A”和“B”是不相关的。但是 B 仍然是新意义上的“链接”,您可以使用存储的路径名作为“A”的快捷方式。现在它是“到 A 的链接”(句点)而不是“与文件 A 的 inode 链接”
这两种链接不仅会混淆人类,还会混淆内核/fs。1971 年的手册页指出:“BUGS:链接被备份两次,并恢复为具有单独 inode 的单独文件。”
指向目录的硬链接(罕见/不允许)很容易导致阻塞。
到目录的软链接(非常常见)可能导致永久循环 - 这些必须由实用程序/内核识别。
bash 中的实际示例
从常规文件“F”开始...
...使 Fhard 的大小与 F 相同,但它们现在都以深红色显示,而
ls -l --color
. 因为stat
显示与“Inode: xyz”相关的“Links: 2”。硬链接 F 将 F 本身变成一个硬链接。两者都是/保持文件类型“常规文件”。但两者都有一个链接计数高于 1 的 inode。...制作一个文件类型为“符号链接”的微小“不规则”文件“Fsoft”——比空目录更节省空间。A
ls -l
对“F”没有什么特别之处。对于 Fsoft,显示的大小为 1 字节,因为字符串为“F”,并Fsoft -> F
显示为名称。无需为软链接着色以识别一个,因为在简短的形式中,您会附加ls -F
一个盘绕链:@
Fsoft@
它
ls -l
看起来像这样:Fhard 具有 F 的大小和类型。
Fsoft 具有 F 的名称和 F 的名称长度作为大小,以及不同的文件类型。
短
ls -sF
:添加
--block-size=1
也不会产生相同的大小。Fsoft 的大小为“一字节,零块”。F 和 Fhard 并行偏离:要查看 Fsoft 是否悬空,
ls
让您使用颜色。记住链接的名称是可选的,这真的很有帮助。如果未给出,则使用链接目标的基本名称。
等同于完全删除链接名称:
如果最后提到链接目标,这将没有任何意义。
想想右边的 Unix -> AT&T -> 目的地:
与 cp 类似,我在脑海中将其解读为“将这个复制到那个”,我将 ln 命令解读为“将这个链接到那个”。
就个人而言,我更喜欢避免记住X,而是在需要时知道在哪里寻找X。我也是“比抱歉更安全”态度的粉丝,所以我总是喜欢仔细检查我正在写的内容,尤其是作为 root。
在这种情况下,答案就在手册页的第一行:
man ln
如果它需要深入研究手册页,我不会建议它,但由于它是在开头,恕我直言,输入和退出所需的 3 秒是值得的。