recriar novo link e remover o link antigo em um comando

1

de acordo com a página de manual:

   man ln


   -f, --force
          remove existing destination files

então, como eu entendo se eu quiser recriar um novo link para algum diretório / arquivo de destino

Eu posso simplesmente fazer

    ln -s -f some_directory new_link

mas isso não é o que eu recebo das minhas máquinas linux / solaris

por exemplo

  [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

agora aceito ver que new_link agora está direcionado para dir1, enquanto "link" não existe mas o link ainda apontava para dir1 também?

como recriar novo link e ao mesmo tempo remover o link antigo em um comando?

( eu não quero usar o comando 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

Outro exemplo diferente

  # 
  # 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

é possível atualizar o link atual para apontar no novo diretório / arquivo

(sem que o arquivo exista?),

ou força para criar o link novamente no diretório diferente ?

    
por Eytan 16.03.2013 / 21:06

2 respostas

7

A opção -f permite sobrescrever o arquivo de destino , ou seja, o arquivo com o nome com o qual você está criando o link, com um novo link. Não verifica outros links no mesmo diretório.

Exemplo:

$ 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

Se você quiser apenas mover o nome do link, para que, em vez de ser chamado de link1 , ele seja chamado de newlink , mova-o:

$ 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

Se você estiver trabalhando com diretórios em vez de arquivos, será necessário adicionar a opção -n e -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
    
por 16.03.2013 / 21:15
4

mv é atômico e fará o que quiser, até onde eu saiba:

mv link new_link
    
por 18.03.2013 / 11:15