Używanie polecenia basename w skryptach Bash

W skryptach Bash jedną z najczęstszych zadań jest manipulacja ścieżkami plików—szczególnie gdy chcesz wyodrębnić tylko nazwę pliku z pełnej ścieżki. W tym miejscu przychodzi polecenie basename. Choć wydaje się proste, basename ma potężne zastosowania, gdy jest używane poprawnie w bardziej złożonych skryptach, narzędziach automatyzacji, usługach hostingowych i środowiskach CI/CD.

Czym jest basename?

Polecenie basename usuwa ścieżkę katalogu i opcjonalnie usuwa rozszerzenie pliku, pozostawiając tylko nazwę podstawową (ostatni element ścieżki pliku).

🔧 Podstawowa składnia:

basename [path] [suffix]

✅ Proste przykłady:

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

Dlaczego używać basename w skryptach?

Oto kilka przykładów rzeczywistych potrzeb skryptowych:

  • Rejestrowanie: Wyodrębnij nazwę pliku dziennika, który jest przetwarzany.

  • Archiwizacja: Dodaj tylko nazwę pliku do skompresowanego archiwum.

  • Automatyzacja: Przetwarzaj partie plików i generuj nazwy wyjściowe plików.

  • Pipelines: Wyodrębnij nazwy plików w krokach CI/CD.

Praktyczne przypadki użycia w skryptach Bash

📁 1. Iterowanie po plikach z rejestrowaniem

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

Ten skrypt iteruje po plikach .log, wyodrębnia nazwę bez rozszerzenia i rejestruje każdą akcję. basename upraszcza obsługę nazw plików bez skomplikowanego krojenia ciągów.

📂 2. Używanie basename dla dynamicznych ścieżek plików

Załóżmy, że otrzymujesz pełne ścieżki z wejścia użytkownika lub innego procesu:

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

Używanie basename w swoim skrypcie zapewnia elastyczność podczas pracy z dynamicznymi ścieżkami plików, szczególnie w środowiskach takich jak Linux VPS, gdzie dzienniki, pliki konfiguracyjne i kopie zapasowe mogą znajdować się w różnych katalogach. To sprawia, że twój skrypt jest odporny niezależnie od tego, czy przekazano mu pełną ścieżkę, taką jak /var/log/syslog, czy względny plik, taki jak ./config.txt.

🧪 3. Łączenie basename z dirname

Użyj ich razem, aby izolować elementy ścieżki:

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

Usuwanie rozszerzeń plików za pomocą basename

Jeśli chcesz usunąć znane rozszerzenia:

basename report-final.txt .txt

⚠️ Uwaga: To działa tylko wtedy, gdy sufiks dokładnie pasuje. Więc .txt działa, ale .TXT lub .tar.gz nie zadziała, chyba że zostanie to wyraźnie określone.

Dla wielu rozszerzeń połącz basename z innymi narzędziami:

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

Lub:

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

basename vs Rozszerzenie parametrów

Chociaż basename jest intuicyjne, uruchamia podproces. Dla skryptów krytycznych dla wydajności lub dużych pętli, preferuj czyste Bash alternatywy:

Rodzajowy odpowiednik Bash:

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

Usuń rozszerzenie za pomocą natywnego Bash:

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

✅ Szybsze niż wywoływanie zewnętrznego basename.

Przykład: Zmiana nazw plików masowo

Załóżmy, że chcesz dodać prefiks do wszystkich plików .jpg z dzisiejszą datą:


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

To używa basename, aby zachować oryginalne nazwy, dodając niestandardowy ciąg na początku.

Użyj basename „$0” do wprowadzeń skryptów

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

Idealne do drukowania przyjaznych dla użytkownika wyników lub dzienników bez pełnych ścieżek.

Polecenie basename jest fundamentalnym narzędziem do manipulacji ścieżkami w skryptach powłoki. Choć na pierwszy rzut oka proste, jego integracja z pętlami, logiką warunkową i rejestrowaniem czyni je nieocenionym w zadaniach automatyzacji i administracji systemem.

Dla zaawansowanych skryptów Bash rozważ rozszerzenie parametrów, aby uniknąć spadków wydajności związanych z wywołaniami podprocesów. Ale dla przejrzystości i przenośności—szczególnie w mieszanych środowiskach Unix—basename pozostaje zaufanym klasykiem.