符号链接和硬链接

https://www.jianshu.com/p/b1614a073087

符号链接和硬链接

 

 


 

 

符号链接-软链接-符号链接

伊恩。d .艾伦–idallen@idallen.cawww.idallen.com

2017年春季/夏季-2017年5月至8月-美国东部时间2017年03月09日09:26更新

更新时间:美国东部时间2017-03-09 09:26

一介绍

与“硬链接”相反,符号链接被称为“软链接”或“符号链接”。它们的发明是为了解决无法对目录进行硬链接的限制。符号链接可以链接到任何事,甚至是目录,所以它们可以给目录起多个名字。

符号链接在20世纪80年代被带到伯克利的Unix(BSD Unix)。30年后,从Windows Vista开始,它们现在可以在微软NTFS中使用。参见:http://www . how togetek . com/how to/windows-vista/using-symlink-in-windows-vista/

2二等公民

符号链接类似于Windows/Macintosh别名,有一些相同的限制。它们是次要名称,因为它们不会更改所链接内容的链接计数字段,如果重命名或删除作为链接目标的实际文件系统对象,它们可能会停止工作。符号链接是二级文件系统对象和许多程序,尤其是递归遍历目录树的程序,例如发现,,复制目录,和递归显示目录结构–不要跟随它们,这样它们就不会在文件系统中造成无限循环。

3创建和列出符号链接

属性创建符号链接构成名词复数链接命令的选项ln,符号链接由前导标识l输出中的字符文件

Symlink语法(RTFM):ln-s TARGET LINK _ NAME $ date % 3e foo $ ln foo硬#硬链接$ ln -s foo软#符号或软链接$ ls -li foo硬软1442426-rw-rw-r-2 alleni alleni 29 3月5日06:50 foo 1442426-rw-rw-r-2 alleni alleni 29 3月5日06:50 hard 1442454 lrwxrwx 1 alle

您会注意到符号链接和硬链接之间的一个直接区别是符号链接不仅仅是同一个信息节点的另一个名称。符号链接获得自己的索引节点,用于存储链接目标名称,这意味着它获得自己的文件类型、权限、所有者、组和修改时间。符号链接就像指向另一个路径名的文件。创建符号链接不会影响链接目标的链接计数。

symlink inode本身的所有者、组和权限会被忽略,并不重要。符号链接中唯一重要的是目标名称。(该在某些系统上,用户可以更改符号链接的所有者和组,但是没有什么可以更改符号链接的权限。阅读男人的页面改变文件权限改变文件的所有者命令来查看它们如何取消引用符号链接。)

您可以创建和删除符号链接,而不会影响作为链接目标的文件系统对象。事实上,目标路径名对符号链接一无所知,完全不受它们的影响。它们的链接计数不会改变。只有硬链接会改变链接计数。

3.1符号链接的目标不会改变

使用创建符号链接软链接:第一个路径名参数是目标符号链接的;它与您当前的目录无关,也不受其影响;这只是一段文字。

任何一个ln下面的命令将创建完全相同的符号链接酒吧-%3E福在……里d目录:

  • $ mkdir-p a/b/c/d;日期%3Ea/b/c/d/foo
    1. $ ln -s foo a/b/c/d/bar
    1. $ CD a;ln -s foo b/c/d/bar
    1. $ CD a/b;ln -s foo c/d/bar
    1. $ CD a/b/c;酒吧
    1. $ CD a/b/c/d;ln -s foo bar

第一个路径名参数是目标符号链接的;当你改变目录时,它不会改变。第二个路径名参数是您想要创建符号链接的位置,当然,如果它是一个相对路径名,那么它会根据您当前的目录而改变。

四取消符号链接的引用

跟踪对其实际文件系统目标的符号链接引用的过程称为”取消引用“象征性的联系。有些命令自动取消引用符号链接;许多没有,尤其是递归遍历文件系统的命令(例如发现,复制目录,等等。).

当符号链接在命令行中作为参数给出时,有些命令会取消引用它们,但是当它们在文件系统的递归遍历中遇到时(例如改变文件权限,改变文件的所有者等等。).

4.1取消绝对路径符号链接的引用

如果符号链接中包含的目标是绝对路径名(即以斜杠开头),则取消符号链接意味着转到该绝对路径名。

例1:取消绝对路径符号链接的引用:

$ cd /tmp$ ln -s /etc/passwd soft #目标是绝对路径名$ ls-l soft lrwxrwx 1 alleni alleni 11 2012-03-18 18:41 soft-% 3E/etc/passwd

上图,符号链接路径名温和的是指向目标的符号链接/etc/passwd这本身就是一个绝对路径名。谈到温和的与所指的相同/etc/passwd(对于符号链接后面的命令):

$ cd /tmp$ ln -s /etc/passwd soft #目标是绝对路径名$ ls-l soft lrwxrwx 1 alleni alleni 11 2012-03-18 18:41 soft-% 3E/etc/passwd $ WC soft #与wc /etc/passwd$ wc相同../tmp/soft #与wc /etc/passwd$ wc相同../../tmp/soft #与wc /etc/passwd相同

例2:取消绝对路径符号链接的引用:

$ CD $ ln-s ~ idallen/public _ html/teaching/cs 8207/16f/notes new notes $ ls-l new notes slrwxrwx 1 alleni alleni 52 3月5日06:00 new notes-% 3E/home/idallen/public _ html/teaching/cs 8207/16f/notes

上图,符号链接路径名新笔记在我的主目录中有一个指向目标的符号链接~ IDA llen/public _ html/teaching/cs t 8207/16f/notes这本身就是一个绝对路径名(因为shell替换了~idallen随着/home/idallen当它读取前导颚化符时)。谈到新笔记与所指的相同/home/idallen/public _ html/teaching/cs t 8207/16f/notes(对于符号链接后面的命令):

$ CD $ ln-s ~ idallen/public _ html/teaching/cs t 8207/16f/notes new notes $ ls-l new notes slrwxrwx 1 alleni alleni 52 3月5日06:00 new notes-% 3E/home/idallen/public _ html/teaching/cs t 8207/16f/notes $ ls new notes #与下一个命令相同:$ ls/home/idallen/public _ html/teaching/cs t 8207/16f/notes $

例3:取消绝对路径符号链接链的引用:

$哪些VI/usr/bin/VI $ ls-l/usr/bin/vilrwxrwx 1根2012年9月20日7/usr/bin/VI-% 3E/etc/替代品/VI $ ls-l/etc/替代品/vilrwxrwx 1根2013年1月16日29/etc/替代品/VI-% 3E/usr/bin/vim . GTK $ ls-l/usr/bin/vim . GTK-rwxr-xr-x 1根

上面,路径名/usr/bin/vi是包含绝对路径的符号链接/etc/alternatives/vi,它本身是一个包含绝对路径的符号链接/usr/bin/vim.gtk,它是一个可执行程序。

$哪个pico/usr/bin/pico $ ls-l/usr/bin/pico lrwxrwx 1根2012年9月7日22/usr/bin/pico-% 3E/etc/替代品/pico $ ls-l/etc/替代品/pico lrwxrwx 1根2012年9月7日/etc/替代品/pico-% 3E/bin/nano $ ls-l/bin/nano-rwxr-xr-x 1根191960年12月3日

上面,我们看到命令微微通过一系列符号链接,实际上是与命令相同的程序文件NANOTECHNOLOGY简称

将绝对路径放入符号链接意味着访问符号链接将访问绝对路径上的任何内容(对于符号链接后面的命令)。

4.2取消引用相对路径符号链接

如果符号链接中包含的目标是相对路径名(即符号链接中的目标不是以斜杠开头),则取消符号链接的引用相对于包含符号链接的目录。找到符号链接引用的实际文件系统对象相对于包含符号链接的目录。要查找相对符号链接引用的实际对象,请使用包含符号链接的目录名,并将符号链接目标(相对路径)附加到其上,例如:

$ ln-s bar/tmp/foo #“bar”是一个相对目标(没有前导斜杠)$ ls-l/tmp/蛮子xrwxrwx 1 alleni alleni 3 Mar 5 05:57/tmp/foo-% 3E bar $ cat/tmp/foo #与cat /tmp/bar相同

以上,任何对符号链接的引用/tmp/foo发现符号链接富(中国姓氏)包含相对(非绝对)路径酒吧,所以结果路径名为/tmp/foo被认为是包含符号链接(/tmp)与相对路径酒吧附加的,给予的/tmp/bar

$ ln-s bar/tmp/foo #“bar”是一个相对目标(没有前导斜杠)$ ls-l/tmp/foo #与cat /tmp/bar$ cat相同../tmp/foo #与cat相同../tmp/bar$ cat../../tmp/foo #与cat相同../../tmp/bar

包含符号链接的目录可能是当前目录:

$ ln-s bar/tmp/foo #“bar”是一个相对目标(没有前导斜杠)$ ls-l/tmp/蛮子xrwxrwx 1 alleni alleni 3 Mar 5 05:57/tmp/foo -%3E bar $ CD/tmp $ cat foo #与cat bar相同,因为foo-% 3E bar

在……里猫食上面一行,富(中国姓氏)是相对路径名,相对路径名总是相对于当前目录。当前目录是/tmp,所以猫食(相对路径)与相同cat /tmp/foo(绝对路径)。自从富(中国姓氏)/tmp/foo本身就是一个相对目标的符号链接酒吧在它里面,规则是取包含目录/tmp并附加相对目标酒吧对它,给予/tmp/bar。因此猫扑与...相同猫吧

另一个使用相对目标的例子..

$ ln -s../tmp/foo # "。是相对目标(无前导斜线)$ ls-l/tmp/蛮干foolrwxrwxrwx 1 alleni alleni 2月5日06:00 /tmp/foo -%3E..$ ls /tmp/foo #与ls /tmp/相同..$ cd /tmp$ ls foo #与ls相同..因为foo -%3E..

另一个使用相对目标的例子

$ ln -s . /tmp/foo # " "是相对目标(无前导斜线)$ ls-l/tmp/蛮干xrwxrwx 1 alleni alleni 1 Mar 5 06:00/tmp/foo-% 3E。$ ls /tmp/foo #与ls /tmp/相同。$ cd /tmp$ ls foo #与ls相同。因为foo -%3E。

另一个使用相对目标的例子a/b

$ ln-s a/b/tmp/foo #“a/b”是一个相对目标(没有前导斜杠)$ ls-l/tmp/蛮干foolrwxrwxrwx 1 alleni alleni 3月5日06:00/tmp/foo -%3E a/b $ ls/tmp/foo #与ls /tmp/a/b相同$ cd /tmp$ ls foo #与ls a/b相同,因为foo-% 3E a/b

更多示例说明如何rbash是…的同义词尝试破折号

$ ls -l /bin/*sh-rwxr-xr-x 1根根959120 2013年3月28日/bin/bash-rwxr-xr-x 1根根109768 2012年3月29日/bin/dashlrwxrwxrwx 1根根4 2013年3月28日/bin/rbash-% 3E bashlwxrwxrwx 1根4 2012年9月7日/bin/sh -%3E dashlrwxrwxrwx 1根

上面,路径名/bin/rbash是具有相对目标的符号链接尝试,所以要取消引用相对符号链接/tmp/rbash我们取包含符号链接的目录(/bin)并附加相对目标路径尝试给予物/bin/bash。因此/bin/rbash真的是/bin/bash

上面,路径名/bin/sh是具有相对目标的符号链接破折号,所以要取消引用相对符号链接/bin/sh我们取包含符号链接的目录(/bin)并附加相对目标路径破折号给予物/bin/dash。因此/bin/sh真的是/bin/dash

5使用(点)作为符号链接目标

包含以下内容的符号链接指它所在的目录,并且可以使目录名在路径名中“消失”:

$ ln -s . /usr/local # " "是相对于"/usr/" so "/usr/"的。$ ls -l /usr/local/bin #与/usr/相同。/bin或/usr/bin

如果你有一个坚持使用/usr/local/bin但是你想简单地使用它/usr/bin,你可以使当地的通过以下方式消失在文件系统中/usr/local符号链接到在你的系统里。

6悬挂符号链接

你可以把任何的将您喜欢的文本放入符号链接的目标中。目标不必存在,甚至看起来不像文件名。如果目标没有解析为现有的文件系统对象,则访问符号链接的程序将给出适当的错误:

$ ln -s nosuchfile bar $ ls-l bar lrwxrwxrwx 1 idallen idallen 10 2月9日10:42 bar-% 3E nosuchfile $ cat bar cat:bar:没有这样的文件或目录$ ln-s“这是一些适合符号链接的随机文本。”foo $ ls-l fourwxrwxrwx。3E这是一些符合符号链接的随机文本。$ cat foocat: foo:没有这样的文件或目录

请注意,错误消息总是使用符号链接的名称,而不是符号链接目标的名称。只有通过稍后检查路径名,您才会发现两者富(中国姓氏)酒吧实际上是指向不存在文件的符号链接。无功能的符号链接称为“断开”或“悬空”符号链接;这是一个不存在的东西的链接。

七符号链接的层次太多

解析路径名时,系统将只处理有限数量的符号链接引用。大多数Unix/Linux系统至少给你八个级别课程Linux服务器目前支持40个。如果您创建了一个直接或通过另一个符号链接链接回自身的符号链接,您会得到一个错误,即链接数已超过:

$ ln-s foo foo $ ls-l foulw xrwx 1 alleni alleni 3 3月5日07:12 foo -%3E foo$ cat foocat: foo:符号链接级别太多$ ln-s a b $ ln-s b a $ ls-l a blrwxrwx 1 alleni 1 3月5日07:11 a-% 3E blrwxrwx 1 alleni 1 3月5日07:11 b -%3E a$ cat acat: a:级别太多

如上所述课程Linux服务器目前(2017年3月)可以解析多达40个符号链接的链。

8命令和符号链接:限位开关(Limit Switch),空间,改变文件权限,改变文件的所有者,发现,可做文件内的字符串查找

大多数通常不取消引用(跟随)符号链接的命令都可以通过适当的命令行选项来取消引用(跟随),请参见手册页。

限位开关(Limit Switch)也就是说,command对符号链接的处理有些不一致ls -l符号链接会显示符号链接本身,但是ls符号链接ls -R符号链接将访问符号链接的目标,如果目标是一个目录,您可以看到目标目录的内容。

空间命令不遵循符号链接。rm -r符号链接仅移除符号链接,不移除目标。

两者改变文件权限改变文件的所有者请务必遵循命令行中给出的符号链接,但忽略在递归下降(-R)中发现的符号链接。

发现默认情况下,命令不遵循符号链接。

使用可做文件内的字符串查找使用“递归”选项遵循符号链接(这是无法防止的——小心文件系统循环!).

9避免使用尾随点()

如前一节所述,如果对符号链接或真实目录进行操作,许多命令的行为会有所不同。有时候你想要目录行为,但是你所拥有的只是符号链接名,你没有得到你想要的。例如,您可能想要查看下面的系统邮箱列表/var/mail,但是在这个系统上/var/mail不是目录,而是符号链接,因此当您限位开关(Limit Switch),您得到的只是符号链接:

$ ls-l/var/mailrwxrwxrwx。1根根10 2011-09-02 09:43 /var/mail -%3E假脱机/邮件

诀窍是附加/.转换成一个真实的目录限位开关(Limit Switch)显示真实内容:

$ ls -l /var/mail/。-rw-rw。1 alleni邮件0 2011-09-02 10:19 alleni-rw-rw -。1佛兰德邮件0 2012-03-11 03:48佛兰德-rw-rw -。1荷马邮报0 2012-03-11 03:48荷马-rw -。1根根831 2011-09-26 01:52根-rw-rw -。1封rpc邮件0

的基本名称(或..)永远不可能是符号链接;它总是一个真实的目录,所以如果富(中国姓氏)是指向目录的符号链接,那么foo/。是symlink和命令的目标的真实目录ls -l fools -l foo/。给出非常不同的结果查找foofind foo/。

$ ln -s / foo # foo是使用“foo”到ROOT$ ls -ld foo #的符号链接,只显示符号链接“foo”本身。1 alleni alleni 1 2012-03-18 20:07 foo-% 3E/$ ls-LD foo/。# "."在ROOT内部;显示了实际的ROOT director ydr-xr-xr-x . 23 ROOT ROOT 4096 2012-03-11 03:49 foo/。使用“foo”的$ find foo #仅查找符号链接“foo”本身。#从ROOT down oo/查找整个系统上的每个文件。foo/。/var[...这里有很多很多的文件名...]

如果您想确保目录路径名是一个符号链接(或者你不知道这个名字是现在还是将来的符号链接),总是追加/.以获取实际目录,而不是链接名称。(当然是这样使用文件名,因为不能追加/.到一个文件。)

10符号链接摘要(符号链接)

  • 类似于Windows/Mac别名,但它们甚至适用于目录
  • 你可以符号链接到任何东西,甚至目录
  • 您可以将符号链接到不存在的路径名——一个“悬空符号链接”

小型测试:

问:如何创建包含路径“/bin”的名为/tmp/foo的符号链接?A: ln -s /bin /tmp/foo$ln-s bar foo;cat fooA: cat: foo:符号链接级别太多$ ls-l FOO barlrwxrwxrwx 1 idallen idallen 3 10月22日12:21 bar-% 3E foulwxrwxrwx 1 idallen idallen 3 10月22日12:21 foo -%3E bar
作者:|伊恩!D. Allen,BA,MMath - idallen@idallen.ca -渥太华,加拿大安大略省|主页:http://idallen.com/联系Improv:http://contactimprov.ca/|学院教授(Free/Libre GNU+Linux)在:http://teaching.idallen.com/|捍卫数字*:http://eff.org/和玩得开心:http://fools.ca/

纯文本-此页面的纯文本版本潘多克减价格式

上一篇:题解 Luogu UVA1619


下一篇:AtCoder Beginner Contest 226「E 思维+并查集」