Usando el comando basename en scripts de Bash

Popular:
¡MEJORA LA CONFIGURACIÓN DE TU SERVIDOR! APLICAR AVA Y LANZA CON UN 15% DE DESCUENTO
USA EL CÓDIGO PROMOCIONAL:

Usando el comando basename en scripts de Bash

En la programación de Bash, una de las tareas más comunes es manipular rutas de archivos, especialmente cuando quieres extraer solo el nombre del archivo de una ruta completa. Ahí es donde entra el comando basename. Aunque parece simple, basename tiene casos de uso potentes cuando se utiliza correctamente en scripts más complejos, herramientas de automatización, hosting services y entornos CI/CD.

¿Qué es basename?

El comando basename elimina la ruta del directorio y, opcionalmente, quita una extensión de archivo, dejando solo el nombre base (el componente final de una ruta de archivo).

🔧 Sintaxis básica:

basename [path] [suffix]

✅ Ejemplos simples:

basename /home/user/docs/report.pdf
basename /home/user/docs/report.pdf .pdf

¿Por qué usar basename en scripts?

Aquí hay solo algunos ejemplos de necesidades reales de scripting:

  • Registro: extrae el nombre de un archivo de log que se está procesando.

  • Archivado: añade solo el nombre del archivo a un archivo comprimido.

  • Automatización: procesa lotes de archivos y genera nombres de salida.

  • Pipelines: extrae nombres de archivo en pasos CI/CD.

 Casos de uso prácticos en scripts de Bash

📁 1. Recorrer archivos con registro

for file in /var/log/*.log; do
name=$(basename "$file" .log)
echo "Processing $name"
# Add further commands like gzip "$file" or tail -n 100
done

Este script recorre archivos .log, extrae el nombre sin extensión y registra cada acción. basename simplifica el manejo de nombres de archivo sin cortes complejos de cadenas.

📂 2. Usar basename para rutas de archivo dinámicas

Supongamos que recibes rutas completas desde la entrada del usuario u otro proceso:

#!/bin/bash
input_path="$1"
filename=$(basename "$input_path")
echo "The file name is: $filename"

Usar basename en tu script garantiza flexibilidad al trabajar con rutas de archivo dinámicas, especialmente en entornos como un Linux VPS donde los logs, archivos de configuración y copias de seguridad pueden residir en diferentes directorios. Esto hace que tu script sea robusto independientemente de si se le pasa una ruta completa como /var/log/syslog o un archivo relativo como ./config.txt.

🧪 3. Combinar basename con dirname

Úsalos juntos para aislar elementos de la ruta:

#!/bin/bash
path="/etc/nginx/nginx.conf"
echo "Directory: $(dirname "$path")"
echo "Filename: $(basename "$path")"

 Eliminar extensiones de archivo con basename

Si quieres eliminar extensiones conocidas:

basename report-final.txt .txt

⚠️ Nota: Esto solo funciona si el sufijo coincide exactamente. Así que .txt funciona, pero .TXT o .tar.gz no, a menos que se especifique explícitamente.

Para múltiples extensiones, combina basename con otras herramientas:

file="/tmp/data/archive.tar.gz"
filename=$(basename "$file")
clean_name=${filename%%.*}
echo "$clean_name"
# Output: archive

O:

filename=$(basename "${file%%.*}")

basename vs Parameter Expansion

Aunque basename es intuitivo, crea un subprocess. Para scripts críticos en rendimiento o bucles grandes, prefiere alternativas de pure Bash:

Equivalente nativo de Bash:

file="/path/to/image.jpg"
filename="${file##*/}"
echo "$filename"
# Output: image.jpg

Eliminar la extensión con Bash nativo:

base="${filename%.*}"
echo "$base"
# Output: image

✅ Más rápido que llamar a basename externo.

Ejemplo: renombrar archivos en lote

Supongamos que quieres añadir como prefijo la fecha de hoy a todos los archivos .jpg:


#!/bin/bash
prefix=$(date +%F)
for img in *.jpg; do
name=$(basename "$img")
mv "$img" "${prefix}_${name}"
done

Esto usa basename para conservar los nombres originales mientras añade una cadena personalizada al principio.

Usa basename «$0» para intros de scripts

echo "Running script: $(basename "$0")"

Perfecto para imprimir salida o logs fáciles de leer sin rutas completas.

El comando basename es una herramienta fundamental para la manipulación de rutas en scripts de shell. Aunque simple a primera vista, su integración con bucles, lógica condicional y registro lo hace invaluable en tareas de automatización y administración de sistemas.

Para scripts avanzados de Bash, considera la parameter expansion para evitar pérdidas de rendimiento por llamadas a subprocess. Pero por claridad y portabilidad, especialmente en entornos Unix mixtos, basename sigue siendo un clásico de confianza.