"ln -sf" 不会覆盖符号链接到目录的情况。

4
ln -sf

不会覆盖给定的目录符号链接。

例如,请参阅。

% ls -ld program*        
drwxr-xr-x 22 b users 4096 Nov 25 14:33 program
drwxr-xr-x 22 b users 4096 Nov 25 14:29 program-201611181546
-rw-r--r--  1 b users    0 Nov 25 14:34 program-current
% ln -fs program-201611181546 program-current
% ls -ld program*                            
drwxr-xr-x 22 b users 4096 Nov 25 14:33 program
drwxr-xr-x 22 b users 4096 Nov 25 14:29 program-201611181546
lrwxrwxrwx  1 b users   18 Nov 25 14:34 program-current -> program-201611181546
% ln -fs program program-current 
% ls -ld program*               
drwxr-xr-x 22 b users 4096 Nov 25 14:33 program
drwxr-xr-x 22 b users 4096 Nov 25 14:34 program-201611181546
lrwxrwxrwx  1 b users   18 Nov 25 14:34 program-current -> program-201611181546

我本来会期望

lrwxrwxrwx  1 b users   18 Nov 25 14:34 program-current -> program

作为解决办法,我可以明确地取消链接。
% unlink program-current 
% ls -ld program*         
drwxr-xr-x 22 b users 4096 Nov 25 14:33 program
drwxr-xr-x 22 b users 4096 Nov 25 14:34 program-201611181546
% ln -fs program program-current
% ls -ld program*               
drwxr-xr-x 22 b users 4096 Nov 25 14:33 program
drwxr-xr-x 22 b users 4096 Nov 25 14:34 program-201611181546
lrwxrwxrwx  1 b users    5 Nov 25 14:35 program-current -> program

但我更喜欢使用ln来完成这个任务。

这种方式可行吗?如何实现?


2
为什么要踩?跟随还是不跟随可能会让人困惑。 - undefined
3个回答

5

man ln

SYNOPSIS
  ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
  ln [OPTION]... TARGET                  (2nd form)
  ln [OPTION]... TARGET... DIRECTORY     (3rd form)
  ln [OPTION]... -t DIRECTORY TARGET...  (4th form)

DESCRIPTION
  In  the  1st form, create a link to TARGET with the name LINK_NAME.
  In the 2nd form, create a link to TARGET in the current directory.
  In the 3rd and 4th forms, create links to each TARGET in DIRECTORY.
您的链接指向一个目录,因此您有第三种表单。

8
使用-T标志,强制使用第一种形式即可实现所需效果: ln -Tfs emacs emacs-current - undefined
但是 OP 没有第三个表单,因为他的输出是一个 LINK_NAME(即第一种形式),而不是一个 DIRECTORY - undefined
@ardnew:由于“program-current”是一个符号链接到一个目录,它会被解引用(默认情况下),所以ln“看到”的是一个目录作为第二个参数,这就成了第三种形式的情况。为了防止ln进行解引用,你需要添加-n(或--no-dereference)。 - undefined
@Adrian 如果 ln 总是解引用,第一种形式怎么会应用呢?它唯一适用的情况是当 LINK_NAME 无法被解引用时,这种情况下选择 LINK_NAME 是一个糟糕的选择。 - undefined
@ardnew 如果LINK_NAME尚不存在,则使用第一种形式。 - undefined

1
这个小的Shell会话导致答案。
从文件开始。
+4:25% touch f1 f2
touch f1 f2
+4:25% mkdir d1 d2
mkdir d1 d2
+4:25% ls -l
drwxr-xr-x 2 b users 4096 Jun 28 16:25 d1
drwxr-xr-x 2 b users 4096 Jun 28 16:25 d2
-rw-r--r-- 1 b users    0 Jun 28 16:25 f1
-rw-r--r-- 1 b users    0 Jun 28 16:25 f2
+4:25% ln -s f1 s0
ln -s f1 s0
+4:26% ls -l
drwxr-xr-x 2 b users 4096 Jun 28 16:25 d1
drwxr-xr-x 2 b users 4096 Jun 28 16:25 d2
-rw-r--r-- 1 b users    0 Jun 28 16:25 f1
-rw-r--r-- 1 b users    0 Jun 28 16:25 f2
lrwxrwxrwx 1 b users    2 Jun 28 16:26 s0 -> f1
+4:26% ln -s f2 s0
ln: failed to create symbolic link 's0': File exists
(1)+4:26% ln -sf f2 s0
+4:26% ls -l
drwxr-xr-x 2 b users 4096 Jun 28 16:25 d1
drwxr-xr-x 2 b users 4096 Jun 28 16:25 d2
-rw-r--r-- 1 b users    0 Jun 28 16:25 f1
-rw-r--r-- 1 b users    0 Jun 28 16:25 f2
lrwxrwxrwx 1 b users    2 Jun 28 16:26 s0 -> f2

创建符号链接目录。

+4:27% ln -sf d1 s0
+4:27% ls -l
drwxr-xr-x 2 b users 4096 Jun 28 16:25 d1
drwxr-xr-x 2 b users 4096 Jun 28 16:25 d2
-rw-r--r-- 1 b users    0 Jun 28 16:25 f1
-rw-r--r-- 1 b users    0 Jun 28 16:25 f2
lrwxrwxrwx 1 b users    2 Jun 28 16:27 s0 -> d1
+4:27% ln -sf d2 s0

这里没有警告信息!

+4:27% ls -l
drwxr-xr-x 2 b users 4096 Jun 28 16:27 d1
drwxr-xr-x 2 b users 4096 Jun 28 16:25 d2
-rw-r--r-- 1 b users    0 Jun 28 16:25 f1
-rw-r--r-- 1 b users    0 Jun 28 16:25 f2
lrwxrwxrwx 1 b users    2 Jun 28 16:27 s0 -> d1

最后,有一个

标签。

+4:27% ln -sfT d2 s0
+4:27% ls -l
drwxr-xr-x 2 b users 4096 Jun 28 16:27 d1
drwxr-xr-x 2 b users 4096 Jun 28 16:25 d2
-rw-r--r-- 1 b users    0 Jun 28 16:25 f1
-rw-r--r-- 1 b users    0 Jun 28 16:25 f2
lrwxrwxrwx 1 b users    2 Jun 28 16:27 s0 -> d2
+4:28% 

0
当你想要更新一个符号链接到一个目录时,你需要使用ln -snf命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接