El comando basename y dirname en Linux: manipular rutas de archivos

Introducción

En el trabajo diario con la línea de comandos de Linux es frecuente tener que manipular rutas de archivos para obtener solo el nombre del archivo o el directorio que lo contiene. Los comandos basename y dirname forman parte del conjunto básico de herramientas que permiten realizar estas operaciones de forma rápida y sin necesidad de expresiones regulares complejas. Este artículo explica qué hacen, cómo se usan y muestra ejemplos prácticos que puedes aplicar en tus scripts y en la terminal.

Qué es basename

El comando basename extrae el último componente de una ruta, es decir, el nombre del archivo o del último directorio en la cadena. Su sintaxis más simple es basename ruta [sufijo]. Si se proporciona un sufijo, basename lo elimina del resultado siempre que coincida con el final del nombre. Esta característica resulta útil cuando se quiere quitar una extensión de archivo como .txt o .log sin usar herramientas adicionales.

Qué es dirname

Por su parte, dirname devuelve todo lo que precede al último componente de la ruta, es decir, el directorio que contiene el archivo o subdirectorio especificado. Si la ruta no contiene ninguna barra, dirname devuelve un punto (.) que representa el directorio actual. Esta herramienta es ideal para construir rutas relativas o para cambiar a el directorio de trabajo antes de ejecutar otra operación.

Sintaxis y opciones

Ambos comandos comparten una sintaxis muy similar. La forma general es:

  • basename cadena [sufijo]
  • dirname cadena

No existen opciones largas como --help en algunas distribuciones, pero se puede usar --version para ver la versión y --help para mostrar una breve ayuda. En la práctica, lo más importante es entender cómo se trata la cadena de entrada.

Algunos puntos a tener en cuenta:

  • Las barras finales se ignoran; basename /home/user/ devuelve user.
  • Si la cadena consta solo de barras, basename //// devuelve vacío y dirname devuelve /.
  • Los caracteres especiales como espacios o comodines deben estar protegidos con comillas o escapados.

Ejemplos prácticos

Imaginemos la ruta /var/log/nginx/error.log.

  • basename /var/log/nginx/error.log devuelve error.log.
  • basename /var/log/nginx/error.log .log elimina el sufijo y muestra error.
  • dirname /var/log/nginx/error.log devuelve /var/log/nginx.

Otro caso frecuente es trabajar con rutas relativas:

  • basename src/main.cmain.c
  • dirname src/main.csrc

Cuando se necesita eliminar varias extensiones, se puede encadenar el uso de basename:

  • basename archivo.tar.gz .gzarchivo.tar
  • Luego aplicar nuevamente basename archivo.tar .tararchivo

Combinar ambos

En muchos scripts es necesario obtener tanto el nombre del archivo como su directorio para realizar operaciones como copiar, renombrar o hacer backup. Un patrón común es:

NAME=$(basename '$RUTA')
DIR=$(dirname '$RUTA')

Con estas dos variables se puede, por ejemplo, reconstruir una ruta en otra ubicación:

cp '$RUTA' '/backup/$DIR/$NAME'

O cambiar la extensión manteniendo el mismo directorio:

NEWNAME=$(basename '$RUTA' .log)
mv '$RUTA' '$DIR/$NEWNAME.txt'

Casos de uso en scripts

Los scripts de administración de sistemas a menudo procesan listas de archivos generadas por find o ls. Por ejemplo, para renombrar todos los archivos .bak eliminando la extensión:

for f in $(find . -name '*.bak'); do
base=$(basename '$f' .bak)
mv '$f' '$base'
done

Para crear un directorio de destino que refleje la estructura de origen:

src=/home/user/proyectos/proyecto1/src/main.c
dest_dir=/tmp/backup/$(dirname '$src')
mkdir -p $dest_dir
cp $src $dest_dir/

Consejos y trucos

  • Siempre encierra la variable en comillas para evitar que espacios o caracteres especiales rompan el comando.
  • Si solo necesitas el nombre sin extensión y no sabes cuál es, puedes usar basename $f ${f##*.} en Bash, pero basename con un sufijo conocido es más legible.
  • En entornos donde basename no está disponible (por ejemplo, sistemas embebidos muy mínimos), puedes lograr el mismo resultado con parámetros de expansión de Bash: ${ruta##*/} equivale a basename y ${ruta%/*} equivale a dirname.
  • Verifica que la variable no esté vacía antes de usarla; una ruta mal formada puede producir resultados inesperados.

Conclusión

Los comandos basename y dirname son herramientas esenciales para cualquier usuario o administrador de Linux que trabaje con rutas de archivos. Su simplicidad, combinada con la capacidad de eliminar sufijos y obtener directorios, los hacen ideales para scripts de automatización, procesamiento de logs y tareas de mantenimiento del sistema. Dominar su uso te permitirá escribir código más limpio, seguro y eficiente en la línea de comandos.