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 ruta
  • readlink -f — resuelve una ruta a su forma absoluta
  • realpath — similar a readlink -f, disponible en sistemas modernos