Comando basename in Linux: estrarre nomi e rimuovere suffissi
basename estrae l’ultimo nome da una stringa di percorso, eliminando la parte della directory. Può anche togliere un suffisso indicato esplicitamente: è utile negli script per ottenere un nome da visualizzare senza rinominare file.
Il comando elabora una stringa: non apre il file, non risolve i collegamenti simbolici e non verifica che il percorso esista. Gli esempi seguenti possono quindi usare percorsi inesistenti senza creare file o directory.
Cos'è il comando basename?
Usa basename quando ti serve solo l’ultimo componente di un percorso, per esempio il nome report.txt senza le directory che lo precedono.
basename /home/user/report.txt
L'output è il seguente.
report.txt
Il risultato deriva dal testo del percorso, non dal tipo di oggetto eventualmente presente sul disco. Le barre finali vengono eliminate prima di estrarre il nome, salvo casi speciali come la radice /.
Sintassi di base e utilizzo
basename name [suffix]
basename options name...
La prima forma accetta un nome e un eventuale suffisso; la seconda consente le opzioni GNU per elaborare più nomi. Ecco tre esempi indipendenti:
basename /var/log/nginx/access.log
basename /home/user/Documents/
basename relative/path/file.txt
I risultati sono, nell’ordine, access.log, Documents e file.txt. Per la radice /, il risultato resta /. Gli input vuoti e // hanno aspetti dipendenti dall’implementazione secondo POSIX: non basare uno script portabile su una sola prova di quei casi.
Rimuovere un suffisso
Indicare il suffisso come secondo argomento
Il secondo argomento è la stringa finale da rimuovere. Non è un altro percorso da elaborare: viene tolto soltanto se coincide con la parte finale del nome estratto e non con l’intero nome.
basename /data/archive.tar.gz .gz
basename /home/user/report.txt .txt
I risultati sono archive.tar e report. Per togliere tutto .tar.gz, specifica quel suffisso completo; il comando seguente restituisce archive.
basename /data/archive.tar.gz .tar.gz
Rimuovere un suffisso da più nomi con -s
Nel comando GNU, -s o --suffix indica il suffisso come opzione e attiva anche l’elaborazione di più nomi, equivalente a -a. I comandi seguenti restituiscono prima a e b, poi app e test.
basename -s .jpg /images/a.jpg /backup/b.jpg
basename --suffix=.log /var/log/app.log /tmp/test.log
Se il suffisso non corrisponde, il nome resta invariato. Il confronto è letterale e distingue maiuscole e minuscole: non è un’espressione regolare. Inoltre basename report.txt report.txt restituisce report.txt, perché un suffisso uguale all’intero nome non lo svuota.
Elaborazione di più percorsi
Elaborare più nomi con -a
Con GNU -a o --multiple puoi trattare più argomenti come nomi indipendenti. Ogni risultato termina normalmente con una nuova riga. Senza questa opzione, la forma a due argomenti interpreta il secondo come suffisso.
basename -a /srv/www/index.html /var/log/syslog /home/user
Per il comando precedente, il risultato è:
index.html
syslog
user
Usare il separatore NUL con -z
Un nome di file può contenere una nuova riga, quindi dividere semplicemente l’output in righe può confondere nomi e separatori. GNU -z o --zero termina ogni risultato con il byte NUL, di valore zero, che non può far parte di un nome di file Unix. Anche il programma che riceve i dati deve leggere quel separatore.
basename -z -a /data/file1 /data/file2 |
while IFS= read -r -d '' name; do
printf 'Nome: <%s>\n' "$name"
done
Nell’esempio completo precedente, basename emette due nomi separati da NUL e il ciclo Bash li legge con read -r -d ''. I messaggi visibili sono Nome: <file1> e Nome: <file2>. La stampa finale serve solo per osservare il risultato; per un’ulteriore elaborazione automatica conserva la separazione NUL e non usare la sostituzione $(...) per memorizzare un flusso contenente byte NUL.
Confrontare basename e dirname
| Input | basename |
dirname |
|---|---|---|
/home/user/report.txt |
report.txt |
/home/user |
docs/manual.pdf |
manual.pdf |
docs |
notes.txt |
notes.txt |
. |
/ |
/ |
/ |
basename restituisce l’ultimo nome; dirname ricava la parte della directory. Si completano quando separi un percorso, ma ricongiungere i risultati con una barra non garantisce di riprodurre il testo originale: barre ripetute e casi speciali possono essere normalizzati. Guida a dirname (in inglese)
Gestione delle estensioni dei file
Rimuovere estensioni note
Se conosci l’estensione da eliminare, indicarla come suffisso rende la regola esplicita. I due comandi seguenti restituiscono rispettivamente photo e backup.
basename photo.webp .webp
basename backup.tar.gz .tar.gz
La corrispondenza riguarda la parte finale: basename report.txt.bak .txt restituisce ancora report.txt.bak, perché il nome termina con .bak.
Un punto non identifica sempre un’estensione
Un nome può iniziare con un punto, come .profile, contenere più suffissi, come archive.tar.gz, oppure terminare con un punto. Il comando non interpreta da solo il significato di queste convenzioni.
Definisci quali suffissi rimuovere secondo le regole dell’applicazione. Eliminare automaticamente tutto ciò che segue l’ultimo punto può produrre risultati diversi da quelli desiderati per nomi nascosti o archivi composti.
Usare basename negli script shell
Ottenere un nome da visualizzare
path='/srv/uploads/annual report.pdf'
name=$(basename -- "$path") || exit 1
printf 'Nome del file: %s\n' "$name"
Il risultato è Nome del file: annual report.pdf. Il separatore -- impedisce che un nome iniziante con un trattino venga interpretato come un’opzione; le virgolette doppie mantengono gli spazi all’interno di un solo argomento. Questo esempio usa $(...), che elimina le nuove righe finali: per nomi che possono terminare con una nuova riga, adotta un’interfaccia adatta, come il flusso NUL illustrato prima.
Confronto con l’espansione dei parametri POSIX
Se il formato del percorso è noto, puoi ottenere l’ultima parte direttamente nella shell. Nell’esempio seguente, ${path##*/} rimuove il prefisso più lungo che termina con una barra, senza avviare basename. Il risultato è report.pdf.
path='/srv/uploads/report.pdf'
name=${path##*/}
printf '%s\n' "$name"
Le due operazioni non sono equivalenti per tutti gli input. Con path='docs/', l’espansione produce una stringa vuota e basename produce docs; con path='/', produce una stringa vuota mentre basename mantiene /. Se non controlli il formato dell’input, verifica prima quale regola serve al programma.
Opzioni principali del comando GNU
| Opzione | Descrizione |
|---|---|
-a, --multiple |
Tratta più argomenti come nomi e restituisce un risultato per ciascuno. |
-s suffix, --suffix=suffix |
Elimina il suffisso indicato da ogni nome e attiva anche l’elaborazione multipla. |
-z, --zero |
Termina ogni risultato con NUL anziché con una nuova riga. |
--help |
Mostra la sintassi e le opzioni supportate. |
--version |
Mostra la versione installata di GNU Coreutils. |
-a, -s e -z sono estensioni GNU. La forma di base definita da POSIX è basename stringa [suffisso]. Per script destinati a sistemi Unix diversi, controlla l’implementazione disponibile invece di presumere il supporto delle opzioni GNU.
Problemi comuni
Un percorso inesistente produce comunque un risultato
È normale: il comando esamina la stringa e non verifica il file system. Se devi aprire, elaborare o spostare un file reale, controlla separatamente i requisiti dell’operazione; il successo di basename non prova che il file esista o sia accessibile.
Un percorso con spazi viene diviso in più argomenti
Quando usi una variabile, racchiudila tra virgolette doppie per evitare la suddivisione in parole e l’espansione dei caratteri jolly da parte della shell. Dopo aver assegnato a path il percorso desiderato, usa:
basename -- "$path"
Suffisso non rimosso
Controlla che il suffisso coincida con la parte finale e rispetti maiuscole e minuscole. Una stringa come *.txt, passata tra virgolette, viene confrontata letteralmente, non come modello di ricerca. Se il suffisso è uguale all’intero nome, il nome resta invariato.
Domande frequenti
basename cambia il nome del file sul disco?
No. Elabora la stringa ricevuta e stampa il nome risultante senza modificare file o directory.
basename può rimuovere un'estensione?
Sì. Per esempio, basename /data/report.txt .txt restituisce report. Con GNU puoi usare basename -s .txt /data/a.txt /data/b.txt per ottenere a e b da due nomi.
basename funziona su un percorso inesistente?
Sì. Il comando ricava l’ultimo componente dalla stringa anche se il percorso non esiste. Il risultato non certifica l’esistenza di un file.
Qual è la differenza con dirname?
basename estrae l’ultimo nome dal percorso; dirname ricava la parte della directory. Per esempio, da docs/manual.pdf ottieni rispettivamente manual.pdf e docs.




