Utilizzo del comando basename negli script Bash

Negli script Bash, una delle operazioni più comuni è la manipolazione dei percorsi dei file, soprattutto quando si vuole estrarre solo il nome del file da un percorso completo. È qui che entra in gioco il comando basename. Anche se apparentemente semplice, basename ha un uso potente se usato correttamente in script più complessi, strumenti di automazione, servizi di hosting e ambienti CI/CD.

Che cos’è basename?

Il comando basename elimina il percorso della directory e, facoltativamente, l’estensione di un file, lasciando solo il nome di base (il componente finale di un percorso di file).

🔧 Sintassi di base:

basename [path] [suffix]

✅ Esempi semplici:

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

Perché usare basename negli script?

Ecco alcuni esempi di esigenze reali di scripting:

  • Registrazione: Estrarre il nome di un file di log in fase di elaborazione.

  • Archiviazione: Aggiungere solo il nome del file a un archivio compresso.

  • Automazione: Elaborazione di batch di file e generazione di nomi di file di output.

  • Pipeline: Estrarre i nomi dei file nelle fasi CI/CD.

Casi d’uso pratici negli script Bash

📁 1. Eseguire il looping dei file con la registrazione

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

Questo script esegue un loop sui file .log, estrae il nome senza l’estensione e registra ogni azione. basename semplifica la gestione dei nomi dei file senza complesse operazioni di taglio delle stringhe.

📂 2. Uso di basename per i percorsi dinamici dei file

Supponiamo di ricevere percorsi completi dall’input dell’utente o da un altro processo:

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

L’uso di basename nello script garantisce la flessibilità quando si lavora con percorsi di file dinamici, specialmente in ambienti come un VPS Linux dove i log, i file di configurazione e i backup possono risiedere in directory diverse. Questo rende lo script robusto, indipendentemente dal fatto che gli venga passato un percorso completo come /var/log/syslog o un file relativo come ./config.txt.

🧪 3. Combinazione di basename e dirname

Usateli insieme per isolare gli elementi del percorso:

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

Rimozione delle estensioni dei file con basename

Se si desidera rimuovere le estensioni conosciute:

basename report-final.txt .txt

⚠️ Nota: questo funziona solo se il suffisso corrisponde esattamente. Quindi .txt funziona, ma .TXT o .tar.gz no, a meno che non sia specificato esplicitamente.

Per estensioni multiple, combinare basename con altri strumenti:

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

Oppure:

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

basename vs Espansione di parametri

Sebbene basename sia intuitivo, genera un sottoprocesso. Per gli script critici dal punto di vista delle prestazioni o per i cicli di grandi dimensioni, preferire le alternative Bash pure:

Equivalente nativo di Bash:

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

Rimuovere l’estensione con Bash nativo:

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

✅ Più veloce che chiamare il nome di base esterno .

Esempio: Rinominare i file in blocco

Supponiamo di voler anteporre a tutti i file .jpg la data di oggi:

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

Questo utilizza basename per preservare i nomi originali, aggiungendo una stringa personalizzata.

Usa il nome di base “$0” per le introduzioni agli script

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

Perfetto per stampare output di facile utilizzo o log senza percorsi completi.

Il comando basename è uno strumento fondamentale per la manipolazione dei percorsi negli script di shell. Sebbene sia semplice a prima vista, la sua integrazione con i loop, la logica condizionale e la registrazione lo rende prezioso per l’automazione e l’amministrazione del sistema.

Per gli script Bash avanzati, considerate l‘espansione dei parametri per evitare i problemi di prestazioni dovuti alle chiamate ai sottoprocessi. Ma per chiarezza e portabilità, soprattutto in ambienti Unix misti, Basename rimane un classico affidabile.