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.
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).
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.
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.
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.
Usateli insieme per isolare gli elementi del percorso:
#!/bin/bash
path="/etc/nginx/nginx.conf"
echo "Directory: $(dirname "$path")"
echo "Filename: $(basename "$path")"
Se si desidera rimuovere le estensioni conosciute:
⚠️ 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:
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:
✅ Più veloce che chiamare il nome di base esterno .
Supponiamo di voler anteporre a tutti i file .jpg la data di oggi: