
¿Existe una forma adecuada de vincular /home/user/app/public
, /home/user/public_html
considerando el hecho de que el objetivo ya existe?
Si lo hago ln -s /home/user/app/public /home/user/public_html
, termino teniendo /home/user/public_html/public
.
Supongo que también sería posible invertir la acción como ln -s /home/user/public_html /home/user/app/public
, sin embargo, no estoy seguro de cómo evitarlo /home/user/app/public/public_html
como resultado final.
Respuesta1
Déjame entender tu problema de la manera correcta
Su fuente es /home/user/public_html
y supongo que tiene archivos allí. Y desea crear un vínculo a este directorio directamente en /home/user/app/public
. De esta manera, podrías hacer algo como ls /home/user/app/public
ver los archivos que existen en /home/user/public_html
.
Si esto es correcto, entonces su fuente es /home/user/public_html
y el destino es /home/user/app/public
. El comando correcto es este:
ln -s /home/user/public_html /home/user/app/public
Solo asegúrese de que /home/user/app/public
no sea un directorio o archivo válido antes de ingresar el comando.
Respuesta2
Si entiendo correctamente su pregunta, quería saber cómo abordar los objetivos ya existentes. Si ese es el caso, hay dos escenarios posibles.
1) el objetivo existente es un archivo. Si este es el caso, puedes forzar la creación del enlace simbólico con "-f"
2) el objetivo existente es un directorio. Si este es el caso, entonces depende de su implementación actual del comando ln. Élpodríatenga disponible el argumento "-n", lo que hace que los enlaces simbólicos a los directorios se manejen correctamente, en lugar de duplicarlos como usted dice.
Referencia:https://unix.stackexchange.com/questions/207294/create-symlink-overwrite-if-one-exists
Respuesta3
No voy a entrar en una discusión detallada sobre esto porque ya se seleccionó la respuesta correcta, pero ln
simplemente no funciona de esa manera.
Una solución alternativa sería utilizar mount
en lugar de ln
. Creo que el comando correcto en este caso sería:
sudo mount --bind ~/app/public ~/public_html
Sin embargo, tenga en cuenta la advertencia de hacerlo de esta manera: en mi experiencia, mount
requiere privilegios, por lo que tendrá que hacerlo sudo
. Por esta razón no puedes ingresarlo .profile
ya que bloqueará tu sesión. Podrías ponerlo en un script o agregarlo a /etc/fstab
. Generalmente no agrego montajes enlazados fstab
, pero creo que la entrada sería:
/home/user/app/public /home/user/public_html none defaults,bind 0 0
o algo muy parecido. También estoy bastante seguro de que no puedes usar rutas relativas en fstab
, por lo que las rutas deben ser absolutas, como he mostrado aquí.
Respuesta4
Como aluden @jotadepicas y @Milkmannetje en los comentarios, hay un par de formas de lidiar con esto.
Suponiendo que su origen es $source
y su destino es $target
.
Retire el objetivo manualmente primero. Esto debería funcionar en Linux y Mac de forma consistente.
rm "$target" ln -s "$source" "$target"
Si estás en Linux puedes usar la
-T
opción.ln -sT "$source" "$target"
Si estás en macOS puedes usar la
-F
opción.ln -sF "$source" "$target"