Cómo conseguir el camino completo al objetivo del enlace

9

Si tengo un enlace simbólico /var/opt/foo creado con ln -fs /path/to/target/dir foo. ¿Cómo puedo en un script que solo ve el enlace obtener? /path/to/target/dir?

Lo que quiero lograr en el guión es rm -rf /path/to/target/dir antes que yo ln -fs /path/to/another/dir foo.

Nifle
fuente

Respuestas:

25
link=/var/opt/foo

target=$(readlink "$link")

$target ahora es el objetivo del enlace, exactamente como se almacenó en el sistema de archivos.

Sin embargo, los enlaces simbólicos pueden ser relativos, por lo que esto sería mejor para el uso normal:

target=$(readlink -f "$link")

Tenga en cuenta que esto utiliza readlink de GNU Coreutils, que puede no existir en BSD y otros sistemas.

Editar: readlink -f Funciona en BSDs, siempre que exista el objetivo de enlace. realpath Es otra herramienta, solo BSD, que funciona de manera similar.

grawity
fuente
1
Los BSDs han tenido una readlink() Llamada al sistema desde los días de 4.2BSD. Los actuales BSDs ' readlink utilidad fue lanzado con FreeBSD 4.10. Fue (re) implementado como un enlace duro para el stat comando Página de manual de MacOS X Página de manual de FreeBSD 9 ). Tenga en cuenta que no tiene una -m opción.
JdeBP
@JdeBP: Gracias. Tiene -fy readlink -f Funciona igual de bien (asumiendo que el objetivo del enlace existe). En BSD, realpath parece ser otra alternativa a readlink -m.
grawity
0

Una forma es (Espero una versión mejor)

olddir=$(pwd)
cd /var/opt/foo
deleteme=$(pwd)
cd $olddir
rm -rf "$olddir"
Nifle
fuente
4
readlink es tu amigo.
JdeBP