Używanie polecenia basename w skryptach Bash

popularne
ZAAWANSUJ SWOJĄ KONFIGURACJĘ SERWERA! APLIKUJ AVA I URUCHOM Z 15% ZNIŻKI
UŻYJ KODU PROMOCYJNEGO:

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:

✅ Proste przykłady:

Dlaczego używać basename w skryptach?

Oto kilka przykładów rzeczywistych potrzeb skryptowych:

Praktyczne przypadki użycia w skryptach Bash

📁 1. Iterowanie po plikach z rejestrowaniem

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:

⚠️ 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:

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:

Usuń rozszerzenie za pomocą natywnego Bash:

✅ 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ą: