Este artículo tal vez les pueda servir al momento de desarrollar un script Bash. Existe una herramienta en Linux, llamada basename
que permite desmenuzar una ruta a un archivo. Es decir, permite remover tanto la ruta al directorio como cualquier sufijo o extensión.
Vamos directamente a un ejemplo utilizando el archivo /usr/lib/jvm/jre/lib/resources.jar
$ ls -l /usr/lib/jvm/jre/lib/resources.jar -rw-r--r-- 1 root root 1055613 Jul 3 15:04 /usr/lib/jvm/jre/lib/resources.jar
basename
toma como parámetro una ruta a un archivo y remueve todos los caracteres comenzando desde la izquierda hasta la última barra inclusive (/
):
$ basename /usr/lib/jvm/jre/lib/resources.jar resources.jar
Si tuvieramos la ruta al archivo en una variable quedaría así:
$ archivo=/usr/lib/jvm/jre/lib/resources.jar $ echo $archivo /usr/lib/jvm/jre/lib/resources.jar $ basename $archivo resources.jar
El resultado se puede almacenar en otra variable (por ejemplo nombre_archivo
) de la siguiente forma:
$ nombre_archivo=$(basename $archivo) $ echo $nombre_archivo resources.jar
En caso de necesitar remover un sufijo o extensión, se debe indicar como un parámetro adicional, por ejemplo:
$ basename /usr/lib/jvm/jre/lib/resources.jar .jar resources $ basename /usr/lib/jvm/jre/lib/resources.jar s.jar resource $ basename /usr/lib/jvm/jre/lib/resources.jar pepe resources.jar
Si el nombre de archivo no posee el sufijo indicado no se produce ningún cambio.
¿Qué sucede si necesitamos realizar la operación inversa? Es decir, de un determinado path remover el nombre de archivo y obtener sólo la ruta completa al directorio. Para ello existe la herramienta dirname
:
$ dirname /usr/lib/jvm/jre/lib/resources.jar /usr/lib/jvm/jre/lib
Se observa que este comando remueve la última barra (/
). Si necesitamos incluir la última barra podemos concatenarla en una variable (llamada "directorio" en este ejemplo) de la siguiente forma:
$ directorio=$(dirname /usr/lib/jvm/jre/lib/resources.jar)/ $ echo $directorio /usr/lib/jvm/jre/lib/
Una herramienta adicional para "destripar" o "desmenuzar" rutas es readlink
. Esta se utiliza para obtener el valor de un link simbólico. Por ejemplo (en mi sistema CentOS), el archivo /usr/bin/mailq
es un link simbólico a /etc/alternatives/mta-mailq
:
$ ls -l /usr/bin/mailq lrwxrwxrwx. 1 root root 27 Jun 21 2012 /usr/bin/mailq -> /etc/alternatives/mta-mailq
Dada una ruta a un link simbólico, readlink
retorna el valor del mismo, es decir la ruta al archivo que apunta:
$ readlink /usr/bin/mailq /etc/alternatives/mta-mailq
Espero que les sirva!