我已经ln
写符号链接多年了,但是我仍然错误地获得了参数的顺序。
这通常让我写:
ln -s a b
然后查看输出以提醒自己。
我总是想像a -> b
当我读到它时实际上却相反b -> a
。这感觉是违反直觉的,所以我发现我总是在猜测自己。
有人有任何提示可帮助我记住正确的顺序吗?
ln source target
。与cp source target
,相同mv source target
; ...
我已经ln
写符号链接多年了,但是我仍然错误地获得了参数的顺序。
这通常让我写:
ln -s a b
然后查看输出以提醒自己。
我总是想像a -> b
当我读到它时实际上却相反b -> a
。这感觉是违反直觉的,所以我发现我总是在猜测自己。
有人有任何提示可帮助我记住正确的顺序吗?
ln source target
。与cp source target
,相同mv source target
; ...
Answers:
我使用以下命令:ln
具有一个单参数形式(在联机帮助页中列出的第二个形式),其中仅需要目标(因为ln
在不知道目标的情况下根本无法工作),并ln
在当前目录中创建链接。两参数形式是单参数形式的加法,因此目标始终是第一个参数。
ln
。
-t
),则感觉就像是一个证明。“ ln
在当前目录中创建链接。两参数形式是单参数形式的补充,因此目标始终是第一个参数”。因为它是有道理的,考虑到第二种形式时,这会出现这种情况,我认为这将有助于我记住。
我的看法是“ ln
就像cp
。'资源'需要首先出现。”
mv
。mv
,cp
和ln
所有采用现有的文件作为第一个参数,和所述预期目的地的文件或目录名作为第二个参数。
memcpy
,strcpy
等工作周围的其他方法。
memcpy(dest,src,n);
地图非常好dest = src;
。换句话说,将n
dest (的第一个字节)设置为等于n
src (的第一个字节)。
大多数Unices将ln
命令记录为
ln source target
(我在这里省略了选项等)
例子:
ln [-fs] [-L|-P] source_file target_file
ln [-fhLnPs] source [target]
ln [-L | -P | -s [-F]] [-f | -iw] [-hnv] source_file [target_file]
苹果系统
ln [-Ffhinsv] source_file [target_file]
/usr/bin/ln [-fns] source_file [target]
ln [ -f | -n ] [ -s ] SourceFile [ TargetFile ]
GNU ln
手册将调用source
目标和target
链接名。
ln [option]… [-T] target linkname
忽略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
ln -s a b
可行,而这与GNU的措辞无关,因为我认为我从未看过手册页中的措词。:D(ln -si a b
如果不确定,运行起来会更容易,如果b
已经存在,则会抱怨。)
在这种情况下,任何人都可以帮助:我已经习惯了它的思想为“LN 什么 地方 ”,这有助于我记得第一个参数(“什么”)是现有的文件,第二个(“里”)是地方放置(链接)到它。与大多数其他答案中的推理相反,这不过是一个愚蠢的短语,我在键入命令时会在脑海中背诵自己,这有助于记忆。这可能对每个人都没有用,但我怀疑这会对某些人有所帮助。
其他标准文件操作命令使用相同的约定也很有帮助,因此我可以对cp
和进行相同的操作mv
。
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
记住链接的名称是可选的,这确实有帮助。如果未指定,则使用链接目标的基本名称。
ln -s /path/to/file1 file1
与完全删除链接名称相同:
ln -s /path/to/file1
如果最后提到链接目标,这将毫无意义。
只要想想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
ln abc def
,abc
和def
是相同的对象;他们是无法区分的。而且,abc
除了增加链接数之外,该操作对均无影响。目的地是def
。指向对象的指针新安装在该def
位置。
ln -s abc def
表示内容abc
已写入location def
。 abc
甚至不必解决任何问题;它可能是一个悬挂的链接。
mv dest src
,ln [ -s ] dest src
,cp dest src
,...
我是这样记住的:忘记目标。换句话说,如果我在dir1中,并且想要在此处创建到/ some / other / dir /中存在的file1的符号链接,我将这样做:
ln -s /some/other/dir/file1
您将在目录dir1中获得一个名为file1的符号链接,该链接指向/ some / other / dir / file1。在ln的手册页中:
ln [OPTION] ... TARGET(第二种形式)...在第二种形式中,创建指向当前目录中TARGET的链接。
请记住,仅当您希望符号链接与目标具有相同的名称时才有效(这很可能是这种情况)。
a
,并将其命名b
”中键入时,大声说出来很有帮助