bash - sistema - links simbólicos
¿Cómo puedo eliminar los enlaces simbólicos en bash? (2)
Esta pregunta ya tiene una respuesta aquí:
- Cómo resolver enlaces simbólicos en un script de shell 16 respuestas
¿Cómo puedo tomar una ruta determinada en bash
y convertirla en su forma canónica, eliminando referencias de enlaces simbólicos que puedan estar contenidos dentro de la ruta?
Por ejemplo:
~$ mkdir /tmp/symtest
~$ cd /tmp/symtest/
/tmp/symtest$ mkdir -p foo/bar cat/dog
/tmp/symtest$ cd foo/bar/
/tmp/symtest/foo/bar$ ln -s ../../cat cat
/tmp/symtest/foo/bat$ cd ../../
/tmp/symtest$ tree
.
|-- cat
| `-- dog
`-- foo
`-- bar
`-- cat -> ../../cat
6 directories, 0 files
¿Cómo puedo obtener la ruta canónica completa de /tmp/symtest/foo/bar/cat
(es decir: /tmp/symtest/cat
)?
Aquí hay una función que resolverá los enlaces simbólicos
Su propósito original es resolver la ruta completa al script de llamada apuntado por un enlace simbólico / usr / bin
# resolve symbolic links
function resolve_link() {
local LINK_FILE=${1:-${BASH_SOURCE[0]}}
local FILE_TYPE=`file $LINK_FILE | awk ''{print $2}''`
local LINK_TO=$LINK_FILE
while [ $FILE_TYPE = "symbolic" ]; do
LINK_TO=`readlink $LINK_FILE`
FILE_TYPE=`file $LINK_TO | awk ''{print $2}''`
done
echo $LINK_TO
}
BASH_SOURCE_RESOLVED=$(resolve_link)
echo $BASH_SOURCE_RESOLVED
No usa recursividad pero nunca he usado recursión en bash
Gracias a Andy Skelton , parece que la respuesta es readlink -f
:
$:/tmp/symtest$ readlink -f /tmp/symtest/foo/bar/cat
/tmp/symtest/cat