Kzq*_*qai 13 directory symlink ln
似乎将一个文件符号链接到子目录中的新文件应该很简单.... ....无需移动子目录。但是关于语法的一些事情令人困惑并且与我的期望背道而驰。这是一个测试用例:
mkdir temp
cd temp
mkdir deploy
echo "Contents of the build file!" > deploy/resources.build.php
ln -s deploy/resources.build.php deploy/resources.php
cat deploy/resources.php #bad symlink
Run Code Online (Sandbox Code Playgroud)
这只会创建一个损坏的符号链接!我在构建环境设置脚本中运行它,所以我想尽可能避免更改当前工作目录。
ln -s deploy/resources.build.php resources.php
cat deploy/resources.php
Run Code Online (Sandbox Code Playgroud)
也不起作用,因为它在临时目录而不是部署子目录中创建符号链接。
cd deploy
ln -s resources.build.php resources.php
cd ..
Run Code Online (Sandbox Code Playgroud)
这有效,但我更想知道如何在不更改目录的情况下执行此操作。
使用完整路径,如:
/home/whatever/src/project/temp/stuff/temp/deploy/resources.build.php
Run Code Online (Sandbox Code Playgroud)
可行,但不实用且有些不切实际,尤其是在构建环境中,所有项目的内容在构建之间可能会有所不同,等等。
如何在子目录中的两个文件之间创建符号链接,而无需移入该子目录并移出该子目录,同时为新文件“别名”提供新名称?
god*_*eek 10
但是关于语法的一些事情令人困惑并且与我的期望背道而驰。
ln
在您使用它的形式中,的参数是:
ln [OPTION]... [-T] TARGET LINK_NAME(第一种形式)
令人困惑且不直观的是,当您创建符号链接时,目标参数ln
不应是文件路径,而是要创建的符号链接的内容。如果你仔细考虑一下,很明显它必须是这样。考虑:
$ echo foo >foo
$ ln -s foo bar1
$ ln -s $PWD/foo bar2
$ cat bar1
foo
$ cat bar2
foo
$ ls -l bar1 bar2
lrwxrwxrwx 1 matt matt 3 Dec 29 16:29 bar1 -> foo
lrwxrwxrwx 1 matt matt 29 Dec 29 16:29 bar2 -> /home/matt/testdir/foo
Run Code Online (Sandbox Code Playgroud)
在该示例中,我创建了 2 个符号链接,名为“bar1”和“bar2”,指向同一个文件。 ls
显示符号链接本身具有不同的内容 - 一个包含绝对路径,一个包含相对路径。因此,即使将其移动到另一个目录,它也会继续工作,而另一个则不会:
$ mv bar2 /tmp
$ cat /tmp/bar2
foo
$ mv bar1 /tmp
$ cat /tmp/bar1
cat: /tmp/bar1: No such file or directory
Run Code Online (Sandbox Code Playgroud)
因此,考虑到我们必须能够创建相对和绝对符号链接,甚至创建损坏的符号链接,如果稍后创建目标文件,这些符号链接将不会被破坏,则必须将目标参数解释为自由格式的文本,而不是已存在文件的路径。
如果您想创建一个名为 deploy/resources.php 的文件,该文件链接到 deploy/resources.build.php,您需要决定是否要创建一个绝对符号链接(它对被移动的符号链接具有弹性,但如果目标被移动),或相对符号链接(只要符号链接和目标一起移动并保持相同的相对路径,它就会继续工作)。
要创建绝对符号链接,您可以执行以下操作:
$ ln -s $PWD/deploy/resources.build.php deploy/resources.php
Run Code Online (Sandbox Code Playgroud)
要创建相对路径,您首先要找出从源到目标的相对路径。在这种情况下,由于源和目标相对于彼此位于同一目录中,因此您可以执行以下操作:
$ ln -s resources.build.php deploy/resources.php
Run Code Online (Sandbox Code Playgroud)
如果它们不在同一目录中,则您需要执行以下操作:
$ ln -s ../foo/f bar/b
Run Code Online (Sandbox Code Playgroud)
在这种情况下,即使foo
和bar
都在您的当前目录中,您需要将 a 包含../
到ln
目标中,因为它描述了如何f
从包含b
.
这是一个非常长的解释,但希望它可以帮助您ln
更好地理解语法。