link simbólico para diretório já existente

link simbólico para diretório já existente

Existe uma maneira adequada de vincular /home/user/app/public, /home/user/public_htmlconsiderando o fato de que o destino já existe?

Se eu fizer isso ln -s /home/user/app/public /home/user/public_html, acabo tendo /home/user/public_html/public.

Acho que seria possível também inverter a ação como ln -s /home/user/public_html /home/user/app/public, porém não tenho certeza de como evitar /home/user/app/public/public_htmlo resultado final.

Responder1

Deixe-me entender seu problema da maneira certa

Sua fonte é /home/user/public_htmle presumo que haja arquivos lá. E você deseja criar um link para esse diretório diretamente no formato /home/user/app/public. Desta forma, você poderia fazer algo como ls /home/user/app/publice ver os arquivos que existem em /home/user/public_html.

Se isso estiver correto, então sua origem é /home/user/public_htmle o destino é /home/user/app/public. O comando adequado é este:

ln -s /home/user/public_html /home/user/app/public

Apenas certifique-se de que /home/user/app/publicnão seja um diretório ou arquivo válido antes de inserir o comando.

Responder2

Se entendi bem sua pergunta, você queria saber como lidar com metas já existentes. Se for esse o caso, existem dois cenários possíveis.

1) o destino existente é um arquivo. Se for esse o caso, você pode forçar a criação do link simbólico com "-f"

2) o destino existente é um diretório. Se for esse o caso, depende da implementação atual do comando ln. Istopoderiatenha o argumento "-n" disponível, o que faz com que o link simbólico para os diretórios seja tratado corretamente, em vez de duplicá-los como você diz.

Referência:https://unix.stackexchange.com/questions/207294/create-symlink-overwrite-if-one-exists

Responder3

Não vou entrar em uma discussão elaborada sobre isso, pois a resposta correta já foi selecionada, mas lnsimplesmente não funciona dessa forma.

Uma solução alternativa seria usar mountem vez de ln. Acredito que o comando correto neste caso seria:

sudo mount --bind ~/app/public ~/public_html

Observe a advertência para fazer isso dessa maneira: na minha experiência, mountrequer privilégios, então você terá que fazê- sudolo. Por esse motivo você não pode inseri-lo, .profilepois isso bloqueará sua sessão. Você pode colocá-lo em um script ou adicioná-lo ao arquivo /etc/fstab. Geralmente não adiciono montagens vinculadas fstab, mas acredito que a entrada seria:

/home/user/app/public /home/user/public_html none defaults,bind 0 0

ou algo muito semelhante. Também tenho certeza de que você não pode usar caminhos relativos fstab, então os caminhos devem ser absolutos, como mostrei aqui.

Responder4

Como @jotadepicas e @Milkmannetje aludem nos comentários, existem algumas maneiras de lidar com isso.

Supondo que sua origem seja $sourcee seu destino seja $target.

  1. Remova o alvo manualmente primeiro. Isso deve funcionar consistentemente no Linux e no Mac.

    rm "$target"
    ln -s "$source" "$target"
    
  2. Se você estiver no Linux, poderá usar a -Topção.

    ln -sT "$source" "$target"
    
  3. Se você estiver no macOS, poderá usar a -Fopção.

    ln -sF "$source" "$target"
    

informação relacionada