Answers:
这对我有用,输出是strace ln -f -s /var/www/html/releases/build1390 app-current
多少?
哦,因为它是目录,所以您需要添加它-n
而无需取消引用,这应该可以解决问题。-f
确实提供了更多便利,因为添加-f只会导致它始终取消链接。尽管我猜想它在正常加载的系统上可能会快几百毫秒。
例如,如果arf已经指向/ home:
strace与-n
:
strace ln -n -f -s / arf
...
symlink("/", "arf") = -1 EEXIST (File exists)
unlink("arf") = 0
symlink("/", "arf") = 0
strace没有-n
:
strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: ) = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1) = 1
因此,在没有-n
取消引用arf的情况下,ln将其视为arf,就好像它实际上是一样/
。在您的特定示例中,如果没有错误,我想您可能已经在其中创建了一个新的符号链接,/var/www/html/releases/build1390 app-current
并希望对其进行清理。
如果目标是符号链接,则可以使用-n
或--no-dereference
防止目标被取消引用。您也可以使用-T
或--no-target-directory
确保将目标文件始终视为常规文件。
如下面的示例所示,它们产生的行为略有不同。假设src
是某个文件,dirlink
是目录的符号链接,并且dir
是实际目录。
使用-n
:
ln -sfn src dirlink
覆盖dirlink
并将其链接到src
ln -sfn src dir
创建链接 dir/src -> src
使用-T
:
ln -sfT src dirlink
覆盖dirlink
并将其链接到src
ln -sfT src dir
产生错误信息: ln: ‘dir’: cannot overwrite directory
cannot overwrite directory
?
ln
它本身不会删除目录-这可能不是一个好主意,因为它将需要递归地删除可能数量庞大的文件。