使用 ln -s 创建链接

使用 ln -s 创建链接

我正在尝试使用以下方法建立链接:

ln -s /Backup files/ /link 1

我没有建立链接,而是得到以下输出:

ln: 目标“/link”不是目录

我究竟做错了什么?

答案1

外壳通常会破坏

ln -s /Backup files/ /link 1

命令行输入这些词:

  • ln
  • -s
  • /Backup
  • files/
  • /link
  • 1

从第一个单词开始,它将派生出要执行的命令(类似于/bin/ln通过搜索变量中列出的所有目录来查找$PATH名为 的文件ln),并将所有这些单词作为单独的参数传递给该/bin/ln可执行文件。

ln会将第二个参数 ( -s) 理解为一个选项,这意味着创建符号链接而不是硬链接,然后将其余参数理解为许多非选项参数。当ln收到两个以上的非选项参数时,它会将最后一个参数理解为一个目录,在其中创建到其他参数的符号链接。

所以,这要求ln创建 3 个符号链接:

  • 1/Backup->/Backup
  • 1/files->files/
  • 1/link->/link

如果1目录不存在或者文件类型不正确目录,它会抱怨。

如果您想ln创建一个名为 的符号链接,/link 1该链接指向/Backup files/¹,您需要将这些参数传递给ln

  • ln
  • -s
  • /Backup files/
  • /link 1

在大多数 shell 中,可以通过以下方式完成:

ln -s '/Backup files/' '/link 1'

这些'字符与空格字符一样,是 shell 语法的一部分。在这里,他们习惯于告诉人们,里面的任何东西都'...'应该按字面意思对待。具体来说,空间字符失去其作为参数分隔符的含义,而是按字面意思包含在传递给 的参数中ln。一些 shell 实现支持更多引用运算符,如"..."$'...'$"..."反斜杠。在类似 Korn 的 shell 中bash,所有这些都是等效的:

ln -s "/Backup files/" "/link 1"
ln -s $'Backup files/' $'/link 1'
ln -s Backup\ files/ /link\ 1

你当然可以将它们组合起来,如下所示:

'ln' "-"'s' "Back"up\ files/ ''""/link' '$'1'

1 但请注意,如果link 1存在并且类型为目录(或符号链接最终解析为目录),则ln -s 'Backup files/' '/link 1'实际上会在该目录中创建Backup files符号链接(a /link 1/Backup files->/Backup files/符号链接)。使用 GNU ln,您可以使用该-T选项来避免这种情况。

答案2

您的文件名缺少双引号。由于它们包含空格,因此需要用引号引起来:

$ ln -s "/Backup files" "/link 1"

相关内容