重新创建新链接并通过一个命令删除旧链接

Eyt*_*tan 1 linux solaris bash ksh shell-scripting

根据 ln 手册页:

   man ln


   -f, --force
          remove existing destination files
Run Code Online (Sandbox Code Playgroud)

据我了解,如果我想重新创建指向某个目标目录/文件的新链接

我可以简单地做

    ln -s -f some_directory new_link
Run Code Online (Sandbox Code Playgroud)

但这不是我从我的 linux/solaris 机器上得到的

例如

  [u@h w]# mkdir dir1
  [u@h w]# ln -s dir1 link
  [u@h w]# ls -l


  drwxr-xr-x 2 root root 4096 Mar 16 20:26 dir1
  lrwxrwxrwx 1 root root    4 Mar 16 20:27 link -> dir1




   [u@h w]# ln -s -f dir1 new_link
Run Code Online (Sandbox Code Playgroud)

现在我接受看到 new_link 现在指向 dir1 而“链接”不存在但链接仍然指向 dir1 ?

如何在一个命令中重新创建新链接并同时删除旧链接?

我不想使用 rm 命令

  [u@h w]# ls -l
  drwxr-xr-x 2 root root 4096 Mar 16 20:26 dir1
  lrwxrwxrwx 1 root root    4 Mar 16 20:27 link -> dir1
  lrwxrwxrwx 1 root root    4 Mar 16 20:28 new_link -> dir1
Run Code Online (Sandbox Code Playgroud)

其他不同的例子

  # 
  # mkdir dir
  # 
  # ln -s dir link
  # 
  # mv dir dir_new
  # ls -l
  total 32
    drwxr-xr-x   2 root     root         117 Mar 16 21:44 dir_new
    lrwxrwxrwx   1 root     root           3 Mar 16 21:44 link -> dir
  # ln -s -f  dir_new link
  ln: cannot create link: File exists
Run Code Online (Sandbox Code Playgroud)

是否可以更新当前链接以指向新目录/文件

(没有获取文件存在?),

或强制在不同的目录上再次创建链接?

Jen*_*y D 7

-f选项允许您使用新链接覆盖目标文件,即具有您创建链接的名称的文件。它不会检查同一目录中的其他链接。

例子:

$ touch file1
$ touch file2
$ ln -s file1 link1
$ ls -l
total 8
-rw-r--r--  1 jenny  staff    0 Mar 16 21:13 file1
-rw-r--r--  1 jenny  staff    0 Mar 16 21:13 file2
lrwxr-xr-x  1 jenny  staff    5 Mar 16 21:13 link1 -> file1
$ ln -s file2 link1
ln: link1: File exists
$ ln -s -f file2 link1
$ ls -l
total 8
-rw-r--r--  1 jenny  staff  0 Mar 16 21:13 file1
-rw-r--r--  1 jenny  staff  0 Mar 16 21:13 file2
lrwxr-xr-x  1 jenny  staff  5 Mar 16 21:14 link1 -> file2
Run Code Online (Sandbox Code Playgroud)

如果您只想移动链接的名称,而不是被调用link1它应该被调用newlink,只需移动它:

$ mv link1 newlink
$ ls -l
total 8
-rw-r--r--  1 jenny  staff  0 Mar 16 21:13 file1
-rw-r--r--  1 jenny  staff  0 Mar 16 21:13 file2
lrwxr-xr-x  1 jenny  staff  5 Mar 16 21:14 newlink -> file2
Run Code Online (Sandbox Code Playgroud)

如果您使用的是目录而不是文件,则需要添加选项-n以及-f

$ ls -l
total 16
drwxrwxr-x 2 jenny jenny 4096 Mar 18 10:37 dir1
drwxrwxr-x 2 jenny jenny 4096 Mar 18 10:37 dir2
$ ln -s dir1 link1
$ ls -l
total 20
drwxrwxr-x 2 jenny jenny 4096 Mar 18 10:37 dir1
drwxrwxr-x 2 jenny jenny 4096 Mar 18 10:37 dir2
lrwxrwxrwx 1 jenny jenny    4 Mar 18 10:37 link1 -> dir1
$ ln -s -n -f dir2 link1
$ ls -l
total 20
drwxrwxr-x 2 jenny jenny 4096 Mar 18 10:37 dir1
drwxrwxr-x 2 jenny jenny 4096 Mar 18 10:37 dir2
lrwxrwxrwx 1 jenny jenny    4 Mar 18 10:38 link1 -> dir2
Run Code Online (Sandbox Code Playgroud)