我正在尝试使用以下方法建立链接:
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"