记住ln参数顺序的提示


64

我已经ln写符号链接多年了,但是我仍然错误地获得了参数的顺序。

这通常让我写:

ln -s a b

然后查看输出以提醒自己。

我总是想像a -> b当我读到它时实际上却相反b -> a。这感觉是违反直觉的,所以我发现我总是在猜测自己。

有人有任何提示可帮助我记住正确的顺序吗?


11
有时,当您在“符号链接到a,并将其命名b”中键入时,大声说出来很有帮助
jsotola

2
就像使用cp一样创建第二个参数,然后创建链接。但是,如果使用错误的方式,则不必担心,因为您无法用新链接覆盖现有文件或符号链接。
sudodus


1
将其视为“坏人的别名”。总是先使用真实姓名来引用他,然后再使用别名。例如:Tony Baloney又名Oscar Meyer。或者,对于您的链接,ln -sab表示“文件-a也称为文件-b”。
Scottie H

1
ln source target。与cp source target,相同mv source target; ...
user207421

Answers:


40

我使用以下命令:ln具有一个单参数形式(在联机帮助页中列出的第二个形式),其中仅需要目标(因为ln在不知道目标的情况下根本无法工作),并ln在当前目录中创建链接。两参数形式是单参数形式的加法,因此目标始终是第一个参数。


3
请注意,没有目的地/目标路径的表单是的POSIX规范的扩展ln
库萨兰达

1
@kusa:您是否在我的回答中看到了带有一个参数的表格的1971年手册?如果posix出现在1971年,该如何扩展?---“如果给定name2,则链接具有该名称”

@SP我不确定我明白你的意思。您是说历史实现在某种程度上胜过当前的POSIX标准吗?
库萨兰达

1
我也看到了 至少要使用不同的名称,相同的参数。我不知道gnu是唯一一个带有这些arg名称的人。

2
这里有很多很好的答案(尤其是@loa_in_的押韵),但我将继续讨论这个问题。指出参数的顺序是一致的(忽略-t),则感觉就像是一个证明。“ ln在当前目录中创建链接。两参数形式是单参数形式的补充,因此目标始终是第一个参数”。因为它是有道理的,考虑到第二种形式时,这会出现这种情况,我认为这将有助于我记住。
Zhro

85

我的看法是“ ln就像cp。'资源'需要首先出现。”


20
...等等mvmvcpln所有采用现有的文件作为第一个参数,和所述预期目的地的文件或目录名作为第二个参数。
汉斯·马丁·莫斯纳

7
这是一个耻辱,memcpystrcpy等工作周围的其他方法。
Arkadiusz Drabczyk

6
@ Hans-MartinMosner,不同之处在于,当您创建符号链接时,它不必是现有文件...
ilkkachu

1
@ilkkachu你是对的。毫无例外:-)
汉斯·马丁·莫斯纳

1
@ArkadiuszDrabczyk另一方面,类似的memcpy(dest,src,n);地图非常好dest = src;。换句话说,将ndest (的第一个字节)设置为等于nsrc (的第一个字节)。
的CVn

10

大多数Unices将ln命令记录为

ln source target

(我在这里省略了选项等)

例子:

  • POSIX标准

    ln [-fs] [-L|-P] source_file target_file
    
  • OpenBSD的

    ln [-fhLnPs] source [target]
    
  • NetBSDFreeBSD

    ln [-L | -P | -s [-F]] [-f | -iw] [-hnv] source_file [target_file]
    
  • 苹果系统

    ln [-Ffhinsv] source_file [target_file]
    
  • 的Solaris

    /usr/bin/ln [-fns] source_file [target]
    
  • 艾克斯

    ln [ -f | -n ] [ -s ] SourceFile [ TargetFile ]
    

GNU ln手册将调用source 目标target 链接名

忽略GNU选择的话,该ln实用程序遵循相同的排序语义例如mv并且cp目标是什么是从创建的

因此,

ln -s a b

将创建b指向的符号链接a

还要注意,在创建符号链接时,源只是一个代表符号链接应指向的字符串。通常不会进行任何检查来验证它是否指向任何有用的东西:

$ ln -s "hello world" README.txt
$ ls -l
total 0
lrwxr-xr-x  1 kk  wheel  11 Sep 15 11:39 README.txt -> hello world

5
我完全归咎于GNU文档的事实是人们完全弄错了这一事实。他们的措词事后看来是可以理解的,但客观上却令人困惑。
康拉德·鲁道夫

6
@KonradRudolph,相反,GNU的用语对我来说似乎很重要。该实用程序将创建一个具有某些名称的链接,该链接指向某处。“链接名称”是有点明显,“目标”是的东西,指出一个非常好的说明。作为轶事,我有时仍必须考虑哪种方法ln -s a b可行,而这与GNU的措辞无关,因为我认为我从未看过手册页中的措词。:D(ln -si a b如果不确定,运行起来会更容易,如果b已经存在,则会抱怨。)
ilkkachu

1
@KonradRudolph,尽管从技术上讲,在硬链接的情况下将其称为“目标”是错误的,因为它不是现有名称,而是实际的目标inode。我想知道GNU人士是否认为普通用户不必这么详细地考虑它。
ilkkachu

有趣的是,正如@gary的答案中所提到的,指出该目标在POSIX标准中不是可选的。
Zhro

@kusa:在“ ln -s AB ---仅将文件名复制到B”的情况下,我采用了您的解释。我什至可以同意您激进的“ hello world”示例。“只有文件名”字符串只是想发信号给你,我修改了一下,加了不少。

7

在这种情况下,任何人都可以帮助:我已经习惯了它的思想为“LN 什么 地方 ”,这有助于我记得第一个参数(“什么”)是现有的文件,第二个(“里”)是地方放置(链接)到它。与大多数其他答案中的推理相反,这不过是一个愚蠢的短语,我在键入命令时会在脑海中背诵自己,这有助于记忆。这可能对每个人都没有用,但我怀疑这会对某些人有所帮助。

其他标准文件操作命令使用相同的约定也很有帮助,因此我可以对cp和进行相同的操作mv


4
我很好奇为什么要拒​​绝投票。这里没有太多可能是错误的-我是否混合了订单或其他内容?
David Z

我个人认为,在没有解释的情况下,“在什么地方”仍然不是明确的:“链接指向的链接是什么?”可能是什么?(正确)或“什么链接到某物?” (错误)。与where相同:“链接指向哪里?” (错误)或“应该在哪里创建链接”(正确)。因此,如果您再次猜测自己的话,这并不一定会有所帮助。记住cp和mv应该会有所帮助。
125_m_125

我们都希望UNIX命令在其他类型的参数之后包含其文件参数(例如grep这样做,例如)。ln创建具有给定内容的某种类型的文件。文件系统做了一些特殊的事情,我们通常将路径放在某个源文件中,这是ln附带的。例如,我可以编写一个文本编辑器,将其第一行的内容存储在名为1的符号链接中,以此类推。这虽然很愚蠢,但它强调ln会创建某种带有某些文本内容的文件,或多或少,使参数顺序看起来合乎逻辑。
丹妮

@ 125_m_125您提出的替代解释对我来说没有多大意义,但是没关系;这种记忆帮助并不适合所有人。
David Z

6

最近,我听到了一种记住这件事的好方法:押韵

旧的东西,新的东西,

借来的东西,蓝色的东西,

和她的鞋子六便士。

第一段是ln的参数:旧的内容,后跟新的目录条目的名称。


3
NAME    ln -- make a link
SYNOPSIS    ln name1[ name2 ]
DESCRIPTION ln creates a link to an existing file name1. 
            If name2 is given, the link has that name; 

从1971年Unix第一版手册

还有第二种简单的语法形式。


编辑:我把文件或文件名,而不是目标---看到留言等等看也很长除了在底部,解决了 冰山,硬和软ln,它不只是冰山一角。


所以GNU ln有这个:

ln [opt] FILENAME

In the 2nd form, create a link to FILENAME in the current directory.

您不需要链接名称的地方。当ln -s /usr/lib/modules你得到一个

modules -> /usr/lib/modules

与FILENAME相同的名称(“目标”或“源”),就在您的位置。没有选择,没有混乱。

现在,如果您的要求更高,并希望以其他名称和/或其他位置创建链接,则可以将该愿望添加为名称或路径。真正的目标位于第一位,额外的幻想新链接名称位于第二位。


或者您说:“我知道ls -l链接的这种箭头符号。外壳中没有箭头可以显示链接的方向。因此,我必须将其转过来。”

您在一个方向上创建它,因此可以在另一个方向上使用它。

(答案部分的结尾)


在另一个层面上,“链接”一词本身带有深层的双重含义。符号链接是后来出现的,因此在早期,链接只是一个链接。没有软硬的-s选择。现在,我什至使用源目标符号:

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

在此阶段,存在链接,但是没有硬性和软性,并且ls -l不显示箭头,因为(硬)链接中没有方向。Unix演化阶段的“链接”意味着文件系统中的文件名“ B”(目录条目“ B”)指向与文件名“ A”指向的相同的inode。

文件A和B被“链接”在一起,因为它们共享相同的块。因此,现在每个rm内核都必须检查:我是在磁盘上删除/释放该文件的块,还是有另一个文件链接到相同的块?为此,使用链接计数器。

假设您要删除/ tmp grom上的大文件并执行ln /tmp/bigfile。现在,您的工作目录中有一个大文件。清除/ tmp并移走“原始”文件后,您会愉快地继续使用相同的数据块。您没有死链接或悬垂的链接,文件正常。指向每个文件都不会阻塞文件,而只会指向文件系统。直到现在,“清理” / tmp的效果不如以前。它看起来是空的,但是,分区上的块没有被释放。

即使硬链接本身不会像cp那样花费空间,但间接地却会。

添加ln -s到上面的序列:

ln -s A B   --- copy only the file's name to "B"   

现在,软链接“ B”仅包含一个带有路径名的字符串。这是“软”信息。从技术上讲,“ A”和“ B”是无关的。但从新的意义上讲,B仍然是“链接”,您可以将存储的路径名用作“ A” 的快捷方式。现在它是“到A的链接”(句号),而不是“与文件A的inode链接”

两种链接不仅会使人困惑,还会使内核/ fs困惑。1971年的手册页中写道:“错误:链接被备份两次,并用独立的inode还原为单独的文件。”

硬链接到目录(稀有/不允许)很容易导致阻塞。

目录的软链接(非常常见)会导致永恒的循环-必须由实用程序/内核识别。

bash中的实际示例

从常规文件“ F”开始...

ln F Fhard

...使Fhard的大小与F相同,但它们现在都显示为深红色,而没有ls -l --color。由于stat显示了与“ Inode:xyz”相关的“链接:2”。硬链接F将F本身变成硬链接。两者都是/保持文件类型为“常规文件”。但是两者都具有链接数大于1的inode。

   ln -s F Fsoft

...制作一个文件类型为“符号链接”的微小“不规则”文件“ Fsoft”-比空目录更节省空间。A ls -l表示“ F”没有什么特别的。对于Fsoft,显示的大小为1字节,因为字符串为'F',并Fsoft -> F显示为名称。无需着色软链接即可识别一个。因为简而言之,ls -F您会获得一个卷曲的链条@Fsoft@

有了ls -l它看起来像这样:

-rw-r--r-- 2 root root 6070340 Sep 16 16:28 F
-rw-r--r-- 2 root root 6070340 Sep 16 16:28 Fhard
lrwxrwxrwx 1 root root       1 Sep 16 16:31 Fsoft -> F

Fhard具有F的大小和类型。

Fsoft具有F的名称和F的名称的长度作为大小,以及不同的文件类型。

简短ls -sF

5932 F    5932 Fhard     0 Fsoft@

添加--block-size=1也不会产生相同的大小。Fsoft的大小为“一字节零块”。F和Fhard平行偏离:

6074368 F  6074368 Fhard    0 Fsoft@

要查看Fsoft是否悬空,ls可以使用颜色。

ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file

2

记住链接的名称是可选的,这确实有帮助。如果未指定,则使用链接目标的基本名称。

ln -s /path/to/file1 file1

与完全删除链接名称相同:

ln -s /path/to/file1

如果最后提到链接目标,这将毫无意义。


1

只要想想Unix-> AT&T->右边的目的地:

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

“ cp foo bar”的意思是“到酒吧”。“ ln abc def”表示“至abc”。如果保留了符号:“ to foo”。那正是问题所在。

@ user370539那是不正确的;之后ln abc defabcdef是相同的对象;他们是无法区分的。而且,abc除了增加链接数之外,该操作对均无影响。目的地是def。指向对象的指针新安装在该def位置。
哈兹

@ user370539如果链接是符号链接,则ln -s abc def表示内容abc已写入location defabc甚至不必解决任何问题;它可能是一个悬挂的链接。
哈兹

您的评论完全是错误的。情况应该相反。
rexkogitans

@rexkogitans我的观点是一致的。如果订单是“错误的”,应该被逆转,那么它应该是所有这些命令:mv dest srcln [ -s ] dest srccp dest src,...
卡兹

0

就个人而言,我宁愿避免记住 X,而宁愿知道需要时在哪里寻找 X。我也是“安全胜于遗憾”态度的粉丝,因此我总是喜欢仔细检查自己在写什么,尤其是作为root用户。

在这种情况下,答案就在手册页的第一行:

   ln [OPTION]... [-T] TARGET LINK_NAME
   (...)
   In the 1st form, create a link to TARGET with the name LINK_NAME.

如果需要深入研究联机帮助页,我不会提出建议,但是由于它是刚开始的时候,恕我直言,值得花3秒的时间输入man ln和退出。


-1

与cp相似,我在心理上将其读为“将其复制到那个”,我将ln命令读为“将其链接到那个”。


2
这与最受好评的答案非常相似。
迈克尔·

因此,“ ln -s AB'将A链接到B?现在是A-> B还是B-> A?我认为大多数人甚至还没有通过混淆的第一阶段。他们说这很简单,但这是错误的。

-2

我是这样记住的:忘记目标。换句话说,如果我在dir1中,并且想要在此处创建到/ some / other / dir /中存在的file1的符号链接,我将这样做:

ln -s /some/other/dir/file1

您将在目录dir1中获得一个名为file1的符号链接,该链接指向/ some / other / dir / file1。在ln的手册页中:

ln [OPTION] ... TARGET(第二种形式)...在第二种形式中,创建指向当前目录中TARGET的链接。

请记住,仅当您希望符号链接与目标具有相同的名称时才有效(这很可能是这种情况)。


有人可以解释为什么这被否决吗?我只是从手册页中复制粘贴了(并因此进行了归属)。它将帮助其他人了解如何在SE上发布信息。谢谢。
跳兔子

我可以解释:这是文化冲突。不用担心 检查其他答案,评论...

-3

我想扩展@gary的答案。

除了他的烦恼之外:该ln命令可以接受任意数量的参数,因此您可以在一次调用中创建多个符号链接(在需要时方便使用)。

  1. 有了这些知识,当您遇到时ln -s foo bar baz,最合理的解释是哪个参数意味着什么?
  2. 有了#1的答案,当您遇到时ln -s foo bar,最合理的解释是哪个参数意味着什么?

1
如果您要对gary的答案进行补充,请建议将其作为编辑内容。照原样,您的两个尾随(假设的?)问题使此“答案”看起来更像是第二个问题。
杰夫·谢勒

-3

想象一下一个版本,ln它允许您在一个命令中创建多个(符号)链接。

Synopsis: ln -s TARGET NEW_LINK...
Example: ln -s target_file  new_link_1  new_link_2  new_link_3

由于反向链接一次只能指向一个TARGET,并且正常的命令行约定是将重复部分放在命令行的末尾,因此不会做任何改变。grep PAT [FILE]...


-6

“ 如此ls显示”a -> bln a b

只要记住这是错误的。


6
我一直记得“某事总是错的”。但是哪种方法是错误的?那就是问题所在。即使我做对了,问题也变成了我的第二次猜测。因为我实际上不记得正确的顺序!
兹罗(Zhro)

我想我明白你的意思:输出ls -llink -> target可以迷惑你如何设置了这个念头ln命令行。但是,恐怕不会有太大帮助。
sudodus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.