2011-12-22 12 views
6

Wow, nunca he utilizado enlaces simbólicos que mucho antes, pero esto es realmente inconcebible:¿Los enlaces simbólicos no funcionan cuando el enlace está hecho en otro directorio?

bash-3.2$ echo "weird" > original.txt 
bash-3.2$ mkdir originals 
bash-3.2$ mv original.txt originals/ 
bash-3.2$ cat originals/original.txt 
weird 
bash-3.2$ mkdir copies 
bash-3.2$ ln -s originals/original.txt copies/copy.txt 
bash-3.2$ cat copies/copy.txt 
cat: copies/copy.txt: No such file or directory 
bash-3.2$ ls copies/copy.txt 
copies/copy.txt 
bash-3.2$ ls -l copies/copy.txt 
lrwxr-xr-x 1 zach staff 22 Dec 22 01:23 copies/copy.txt -> originals/original.txt 
bash-3.2$ cat originals/original.txt 
weird 
bash-3.2$ cat copies/copy.txt 
cat: copies/copy.txt: No such file or directory 
bash-3.2$ cd copies/ 
bash-3.2$ cat copy.txt 
cat: copy.txt: No such file or directory 

Por qué no puedo gato el enlace simbólico en el directorio de copias?

Si hago el enlace simbólico desde el interior de las copias /, puedo hacerlo bien. Si hago el enlace simbólico en el directorio actual, también puedo catarlo bien. Si hago el enlace simbólico en el directorio actual y luego lo muevo a copias /, obtengo "copias/copia.txt: no existe dicho archivo o directorio".

Respuesta

15

Si crea una ruta relativa a un enlace simbólico, la almacenará como un enlace simbólico relativo. Los enlaces simbólicos son relativos a la ubicación en la que se encuentra el enlace, no a la ubicación donde se creó o abrió.


Utilice la ruta absoluta o la ruta relativa al enlace.

Cambio:

ln -s originals/original.txt copies/copy.txt 

Para:

# absolute 
ln -s /path/to/originals/original.txt copies/copy.txt 

# relative 
cd copies 
ln -s ../originals/original.txt copy.txt 
+0

No necesita utilizar una ruta absoluta. Siempre que prefacio tu camino con un punto (lo que significa 'tu ruta de directorio actual') deberías estar bien. – adamwong246

5

También puede utilizar la ruta relativa para lograrlo. como

cd copies 
ln -s ../originals/original.txt copy.txt 

Esto funcionará

al abrir el enlace simbólico que intenta hacer referencia al archivo del directorio de copias y ya que no existe de que está recibiendo ese error.

Cuando utiliza la ruta relativa o absoluta, este problema se resolverá.

+0

Al escribir una secuencia de comandos que crea enlaces simbólicos, ¿hay alguna forma de especificar a qué directorio se debe hacer una ruta relativa? – user225643

+0

Con el script, debe ir por la ruta absoluta.Tener un directorio fijo para contener enlaces simbólicos y luego crear los enlaces pertenecientes a cualquier archivo en el directorio – Raghuram

+0

Todos los enlaces simbólicos relativos son relativos al directorio en el que se encuentra el enlace. No es necesario que un enlace apunte a un archivo existente cuando se crea (como has encontrado). La elección del enlace relativo o absoluto NO se debe hacer en la dificultad de hacer el enlace, pero si desea un enlace relativo o uno absoluto. Recuerde que mover un enlace relativo después de que fue creado cambia la ruta absoluta del archivo al que apunta. Consulte aquí para la conversión: http://stackoverflow.com/questions/2564634/bash-convert-absolute-path-into-relative-path-given-a-current-directory –

1

Considere un ejemplo en el que desee vincular simbólicamente los registros de su aplicación a otro lugar que puede ser un directorio que está montado en un directorio secundario cuyo tamaño no afectará a su servidor para dejar de funcionar. Ahora el directorio montado será el objetivo para usted y debe crear un enlace simbólico a este directorio para su directorio de registros.

Supongamos que su directorio de aplicaciones es/home/ubuntu/my_app y una vez que inicie su aplicación generará un directorio de registro dentro de su directorio my_app. Ahora el objetivo final es desviar la carga de uso del disco al directorio montado y actualmente no tenemos nuestro directorio de registro presente en nuestro directorio de aplicaciones. Por lo que sólo seguir adelante y seguir los siguientes pasos:

mkdir /path_to_mounted_directory/log 
ln -s /path_to_mounted_directory/log /home/ubuntu/my_app_log 

Esto hará primero crear un registro con el nombre de directorio en la sección montada y se asignarán los registros de la aplicación de este directorio. Cualquier archivo que agregue en la carpeta de registro de la aplicación se vinculará automáticamente al directorio montado y podrá leer estos archivos desde cualquier lugar que desee, ya sea desde el directorio de registros originales o desde la carpeta montada.

Cuestiones relacionadas