În scripturile Bash, una dintre cele mai frecvente sarcini este manipularea căilor de acces la fișiere – în special atunci când doriți să extrageți doar numele fișierului dintr-o cale completă. Aici intervine comanda basename. Deși aparent simplă, basename are cazuri de utilizare puternice atunci când este utilizată corect în scripturi mai complexe, instrumente de automatizare, servicii de găzduire și medii CI/CD.
Comanda basename elimină calea directorului și, opțional, o extensie de fișier, lăsând doar numele de bază (componenta finală a căii unui fișier).
Iată doar câteva exemple de nevoi reale de scripting:
Înregistrare: Extragerea numelui unui fișier jurnal în curs de procesare.
Arhivare: Atașați doar numele fișierului la o arhivă comprimată.
Automatizare: Procesați loturi de fișiere și generați nume de fișiere de ieșire.
Conducte: Extrageți numele fișierelor în etapele CI/CD.
Acest script parcurge în buclă fișierele .log, extrage numele fără extensie și înregistrează fiecare acțiune. basename simplifică manipularea numelor de fișiere fără a efectua o feliere complexă a șirurilor.
Să presupunem că primiți căi complete de la intrarea utilizatorului sau de la un alt proces:
#!/bin/bash
input_path="$1"
filename=$(basename "$input_path")
echo "The file name is: $filename"
Utilizarea basename în scriptul dvs. asigură flexibilitate atunci când lucrați cu căi dinamice ale fișierelor, în special în medii precum un VPS Linux în care jurnalele, fișierele de configurare și copiile de rezervă pot fi localizate în directoare diferite. Acest lucru face ca scriptul dvs. să fie robust indiferent dacă i se transmite o cale completă precum /var/log/syslog sau un fișier relativ precum ./config.txt.
Utilizați-le împreună pentru a izola elementele căii:
#!/bin/bash
path="/etc/nginx/nginx.conf"
echo "Directory: $(dirname "$path")"
echo "Filename: $(basename "$path")"
Dacă doriți să eliminați extensiile cunoscute:
⚠️ Notă: Acest lucru funcționează numai dacă sufixul se potrivește exact. Astfel, .txt funcționează, dar .TXT sau .tar.gz nu vor funcționa decât dacă sunt specificate explicit.
Pentru extensii multiple, combinați basename cu alte instrumente:
file="/tmp/data/archive.tar.gz"
filename=$(basename "$file")
clean_name=${filename%%.*}
echo "$clean_name"
# Output: archive
Sau:
Deși basename este intuitiv, acesta generează un subproces. Pentru scripturi cu performanțe critice sau bucle mari, preferați alternative Bash pure:
✅ Mai rapid decât apelul extern basename.
Să presupunem că doriți să prefixați toate fișierele .jpg cu data de astăzi: