终端中的符号链接(我做错了什么?)

终端中的符号链接(我做错了什么?)

我想为文件夹中的所有文件创建符号链接parent/target/。我希望链接位于文件夹中parent/destination/。我的工作目录parent/用于以下终端输出bash

$ cd target/
$ ll
total 16
drwxr-xr-x 4 jesse staff 136 Feb 23 16:31 ./
drwxr-xr-x@ 10 jesse staff 340 Feb 23 16:38 ../
-rw-r--r-- 1 jesse staff 10 Feb 23 16:23 file.txt
-rw-r--r-- 1 jesse staff 10 Feb 23 16:23 file2.txt
$ ln -s * ../destination/
$ ll ../destination/
total 16
drwxr-xr-x 4 jesse staff 136 Feb 23 16:38 ./
drwxr-xr-x@ 10 jesse staff 340 Feb 23 16:38 ../
lrwxr-xr-x 1 jesse staff 8 Feb 23 16:38 file.txt@ -> file.txt
lrwxr-xr-x 1 jesse staff 9 Feb 23 16:38 file2.txt@ -> file2.txt

为什么它会创建链接到自身的符号链接?我已经阅读了ln手册页和各种其他ln与 SE 相关的问题,但我想我只是错过了一些东西。

(我在 OS X 10.11.3 的终端中使用 bash)

答案1

您需要在源中指定一个绝对路径:在您的情况下,它将是:

ln -s $PWD/* ../destination/

与硬链接不同,创建的目录条目直接引用相同的源文件,而符号链接则保存原始文件引用的文本。实际上,创建符号链接时源文件不必存在,但显然使用可以*确保只使用现有的源文件。

事实上,情况比这稍微复杂一些:如果您在链接中指定了绝对路径,则引用该链接的行为就像您指定了原始文件一样;但是如果您指定了相对路径,则会将其添加到链接所在的目录中。因此,您可以从目录中使用的替代方法target是:

cd ../destination/; ln -s ../target/* .

这与绝对路径具有相同的效果,但有一个区别:如果整个目录树被复制或移动到另一位置(例如,在不同用户的目录中的某个位置),则链接将引用新位置的文件。因此,选择绝对链接还是相对链接取决于您是否希望将源文件与链接一起复制或移动:如果源文件始终保留在同一位置,请使用绝对链接。

相关内容