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/devuelveuser. - Si la cadena consta solo de barras,
basename ////devuelve vacío ydirnamedevuelve/. - 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.logdevuelveerror.log.basename /var/log/nginx/error.log .logelimina el sufijo y muestraerror.dirname /var/log/nginx/error.logdevuelve/var/log/nginx.
Otro caso frecuente es trabajar con rutas relativas:
basename src/main.c→main.cdirname src/main.c→src
Cuando se necesita eliminar varias extensiones, se puede encadenar el uso de basename:
basename archivo.tar.gz .gz→archivo.tar- Luego aplicar nuevamente
basename archivo.tar .tar→archivo
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, perobasenamecon un sufijo conocido es más legible. - En entornos donde
basenameno está disponible (por ejemplo, sistemas embebidos muy mínimos), puedes lograr el mismo resultado con parámetros de expansión de Bash:${ruta##*/}equivale abasenamey${ruta%/*}equivale adirname. - 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.