AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 541795
Accepted
Zhro
Zhro
Asked: 2019-09-15 16:57:25 +0800 CST2019-09-15 16:57:25 +0800 CST 2019-09-15 16:57:25 +0800 CST

记住 ln 参数顺序的提示?

  • 772

多年来我一直ln在编写符号链接,但我仍然把参数的顺序弄错了。

这通常让我写:

ln -s a b

然后看着输出提醒自己。

我总是想像a -> b我读到的那样,而实际上恰恰相反b -> a。这感觉违反直觉,所以我发现我总是在怀疑自己。

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

symlink ln
  • 14 14 个回答
  • 7526 Views

14 个回答

  • Voted
  1. Hermann
    2019-09-15T17:37:50+08:002019-09-15T17:37:50+08:00

    我通过“ln就像cp。'来源'需要先出现。”

    • 104
  2. Best Answer
    gary
    2019-09-15T17:17:41+08:002019-09-15T17:17:41+08:00

    我使用以下内容:ln有一个单参数形式(手册页中列出的第二种形式),其中只需要目标(因为ln在不知道目标的情况下如何工作)并ln在当前目录中创建链接。双参数形式是单参数形式的补充,因此目标始终是第一个参数。

    • 45
  3. Kusalananda
    2019-09-16T01:40:28+08:002019-09-16T01:40:28+08:00

    大多数 Unices 将ln命令记录为

    ln source target
    

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

    例子:

    • POSIX 标准

        ln [-fs] [-L|-P] source_file target_file
      
    • 开放式系统:

        ln [-fhLnPs] source [target]
      
    • NetBSD和FreeBSD

        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 ]
      

    GNUln手册很奇怪,它调用了source target和target linkname。

    • GNU 手册ln

        ln [option]… [-T] target linkname
      

    忽略 GNU 的单词选择,该ln实用程序遵循与例如相同的语义,因为mv目标cp是从源创建的。

    所以,

    ln -s a b
    

    b将创建指向的符号链接a。或者换句话说,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
    

    关于 GNU 选择使用“目标”和“链接名称”而不是“源”后跟“目标”的个人想法:

    很明显,第二个参数,即创建的东西,应该是“链接名称”,而第一个参数,链接的目标,是“目标”。但是,仅当您使用该链接时,这才是正确的。

    当您创建链接时,这就是您正在做ln的事情,第二个参数,即创建的东西,是ln操作的“目标”,它是使用第一个参数“源”创建的。

    这与其他基本工具的参数的类似“源”->“目标”顺序一起,使得非 GNU 文档ln看起来更自然。

    • 11
  4. loa_in_
    2019-09-16T11:52:40+08:002019-09-16T11:52:40+08:00

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

    旧的,新的,

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

    和她鞋子里的六便士。

    第一段是 ln 的参数是什么:一些旧的,然后是新目录条目的名称。

    • 9
  5. David Z
    2019-09-16T01:16:41+08:002019-09-16T01:16:41+08:00

    如果这对任何人都有帮助:我已经习惯将其视为“ln what where ”,这有助于我记住第一个参数(“what”)是现有文件,第二个参数(“where”)是位置放置(链接)它。与大多数其他答案中的推理相反,这只不过是一个简洁的短语,我可以在输入命令时在心里背诵它,作为记忆辅助。这可能对每个人都没有用,但我怀疑它会对某些人有所帮助。

    它有助于其他标准文件操作命令使用相同的约定,因此我可以对cpand执行相同的操作mv。

    • 7
  6. user370539
    2019-09-15T18:24:21+08:002019-09-15T18:24:21+08:00
    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 第一版手册。

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


    我用 FILE 或 FILENAME 代替 TARGET --- 见评论等。另见底部很长的补充,解决 冰山,硬和软,ln而不仅仅是冰山一角。


    所以 GNUln有这个:

    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 上的一个大文件不被删除,然后执行ln /tmp/bigfile. 现在您的工作目录中有一个大文件。在清理 /tmp 并删除“原始”之后,您可以愉快地继续使用相同的数据块。你没有死链接或悬空链接,你有一个正常的文件。像每个 dir 条目一样,不指向文件,而只指向文件系统块。只是现在“清理”/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 年的手册页指出:“BUGS:链接被备份两次,并恢复为具有单独 inode 的单独文件。”

    指向目录的硬链接(罕见/不允许)很容易导致阻塞。

    到目录的软链接(非常常见)可能导致永久循环 - 这些必须由实用程序/内核识别。

    bash 中的实际示例

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

    ln F Fhard
    

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

       ln -s F Fsoft
    

    ...制作一个文件类型为“符号链接”的微小“不规则”文件“Fsoft”——比空目录更节省空间。Als -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
    
    • 4
  7. rexkogitans
    2019-09-16T10:07:18+08:002019-09-16T10:07:18+08:00

    记住链接的名称是可选的,这真的很有帮助。如果未给出,则使用链接目标的基本名称。

    ln -s /path/to/file1 file1
    

    等同于完全删除链接名称:

    ln -s /path/to/file1
    

    如果最后提到链接目标,这将没有任何意义。

    • 2
  8. Kaz
    2019-09-18T17:07:16+08:002019-09-18T17:07:16+08:00

    想想右边的 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
    
    • 1
  9. jl6
    2019-09-16T06:11:39+08:002019-09-16T06:11:39+08:00

    与 cp 类似,我在脑海中将其解读为“将这个复制到那个”,我将 ln 命令解读为“将这个链接到那个”。

    • 0
  10. dr_
    2019-09-24T00:54:32+08:002019-09-24T00:54:32+08:00

    就个人而言,我更喜欢避免记住X,而是在需要时知道在哪里寻找X。我也是“比抱歉更安全”态度的粉丝,所以我总是喜欢仔细检查我正在写的内容,尤其是作为 root。

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

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

    man ln如果它需要深入研究手册页,我不会建议它,但由于它是在开头,恕我直言,输入和退出所需的 3 秒是值得的。

    • 0

相关问题

  • 别名路径扩展

  • 如何让 tar 跟随除一个递归符号链接之外的所有符号链接

  • ln 中带有硬链接和软链接的路径

  • 意外创建了指向该文件夹中某个文件夹的符号链接

  • 是否可以在符号链接目录中创建影子文件?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve