Este artículo fue publicado originalmente en go2linux.org el 24 de febrero de 2008. El dominio ya no me pertenece, pero soy el autor original. Lo republico aquí en garron.me con correcciones y mejoras.
Introducción
basename elimina la ruta del directorio de un nombre de archivo y, opcionalmente, un sufijo al final. Forma parte de GNU Coreutils y está disponible en todos los sistemas Linux.
Es especialmente útil dentro de scripts de shell cuando solo necesitas el nombre del archivo a partir de una ruta completa.
Sintaxis
basename NOMBRE [SUFIJO]
basename OPCIÓN... NOMBRE...
Ejemplos básicos
Eliminar el directorio de una ruta:
basename /usr/bin/sort
Salida: sort
Eliminar el directorio y un sufijo:
basename include/stdio.h .h
Salida: stdio
Eliminar una extensión .tar.gz:
basename /home/ggarron/backups/archivo.tar.gz .tar.gz
Salida: archivo
Varios nombres a la vez
Con la opción -a, puedes pasar varios nombres:
basename -a /usr/bin/sort /usr/bin/ls /usr/bin/cat
Salida:
sort
ls
cat
Usar un separador de sufijo personalizado
Con -s, especificas el sufijo y puedes pasar varios nombres:
basename -s .txt /home/usuario/doc1.txt /home/usuario/doc2.txt
Salida:
doc1
doc2
En scripts de shell
basename se usa principalmente en scripts para extraer el nombre del archivo de $0 (la ruta del propio script) o de una variable de bucle.
Obtener el nombre del propio script para mensajes de error:
#!/bin/bash
NOMBRE_SCRIPT=$(basename "$0")
echo "$NOMBRE_SCRIPT: error: algo salió mal" >&2
Renombrar archivos eliminando un sufijo y añadiendo uno nuevo:
for f in /var/log/*.log; do
nombre=$(basename "$f" .log)
cp "$f" "/tmp/${nombre}.bak"
done
Procesar archivos en un bucle sin el prefijo del directorio:
for f in /etc/cron.d/*; do
echo "Tarea cron: $(basename "$f")"
done
dirname — el complemento de basename
dirname hace lo contrario: elimina el nombre del archivo y devuelve el directorio.
dirname /usr/bin/sort
Salida: /usr/bin
Juntos permiten dividir una ruta en sus dos componentes:
ruta=/etc/apt/sources.list
dir=$(dirname "$ruta") # /etc/apt
archivo=$(basename "$ruta") # sources.list
Usa siempre comillas en las variables
Cuando los nombres de archivo pueden contener espacios, pon el argumento entre comillas para evitar la separación de palabras:
basename "$f" # correcto
basename $f # falla con espacios
Véase también
dirname— devuelve la parte del directorio de una rutareadlink -f— resuelve una ruta a su forma absolutarealpath— similar a readlink -f, disponible en sistemas modernos