
Existe uma maneira adequada de vincular /home/user/app/public
, /home/user/public_html
considerando 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_html
o resultado final.
Responder1
Deixe-me entender seu problema da maneira certa
Sua fonte é /home/user/public_html
e 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/public
e ver os arquivos que existem em /home/user/public_html
.
Se isso estiver correto, então sua origem é /home/user/public_html
e 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/public
nã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 ln
simplesmente não funciona dessa forma.
Uma solução alternativa seria usar mount
em 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, mount
requer privilégios, então você terá que fazê- sudo
lo. Por esse motivo você não pode inseri-lo, .profile
pois 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 $source
e seu destino seja $target
.
Remova o alvo manualmente primeiro. Isso deve funcionar consistentemente no Linux e no Mac.
rm "$target" ln -s "$source" "$target"
Se você estiver no Linux, poderá usar a
-T
opção.ln -sT "$source" "$target"
Se você estiver no macOS, poderá usar a
-F
opção.ln -sF "$source" "$target"