Introduzione

basename è un'utilità della riga di comando che rimuove la directory e il suffisso finale dai nomi di file specificati.

Utilizzare il comando basename

Il comando basename supporta due formati di sintassi:

basename NAME [SUFFIX]
basename OPTION... NAME...

basename prende un nome file e stampa l'ultimo componente del nome file. Facoltativamente, può anche rimuovere qualsiasi suffisso finale. È un semplice comando che accetta solo poche opzioni.

L'esempio più semplice è stampare il nome del file con le directory principali rimosse:

basename /etc/passwd

L'output includerà il nome del file:

passwd

Il comando basename rimuove tutti i caratteri finali /:

basename /usr/local/
basename /usr/local

Entrambi i comandi produrranno lo stesso output:

local
local

Per impostazione predefinita, ogni riga di output termina con un carattere di nuova riga. Per terminare le righe con NUL, utilizzare l'opzione -z(--zero).

Ingressi multipli

Il comando basename può accettare più nomi come argomenti. Per fare ciò, richiamare il comando con l'opzione -a(--multiple), seguita dall'elenco di file separati da spazio.

Ad esempio, per ottenere i nomi dei file di /etc/passwd e /etc/shadow dovresti eseguire:

basename -a /etc/passwd /etc/shadow
passwd
shadow

Rimuovere un suffisso finale

Per rimuovere qualsiasi suffisso finale dal nome del file, passare il suffisso come secondo argomento:

basename /etc/hostname name
name

In genere, questa funzione viene utilizzata per rimuovere le estensioni dei file:

basename /etc/sysctl.conf .conf
sysctl

Un altro modo per rimuovere un suffisso finale è specificare il suffisso con l'opzione -s(--suffix=SUFFIX):

basename -s .conf /etc/sysctl.conf
sysctl

Questo modulo di sintassi ti consente di rimuovere qualsiasi suffisso finale da più nomi:

basename -a -s .conf /etc/sysctl.conf /etc/sudo.conf
sysctl
sudo

Esempio

L'esempio seguente mostra come utilizzare il comando basename all'interno di un ciclo bash for per rinominare tutti i file che terminano con ".jpeg" nella directory corrente sostituendo l'estensione del file da ".jpeg" a ".jpg":

for file in *.jpeg; do
    mv -- "$file" "$(basename $file .jpeg).jpg"
done

Se stai usando bash come shell, invece di invocare basename, puoi usare strip the trailing extension (estensione finale) usando Shell Parameter Expansion.

Conclusione

Il comando basename rimuove qualsiasi directory iniziale e suffisso finale dal nome.