basename

Usuwa ścieżkę katalogu (i opcjonalnie rozszerzenie) zwracając samą nazwę pliku.

basename to mały, ale zaskakująco przydatny scyzoryk Linuksa: bierze pełną ścieżkę i zwraca samą nazwę pliku, obcinając wszystko, co jest przed ostatnim ukośnikiem. Opcjonalnie potrafi też zdjąć rozszerzenie. W skryptach ratuje, gdy masz zmienną w stylu /var/log/nginx/access.log, a potrzebujesz tylko access.log — albo gdy chcesz zbudować nazwę pliku wyjściowego bez powtarzania całej ścieżki na sztywno.

Składnia i najważniejsze opcje

Podstawowa składnia: basename ŚCIEŻKA [SUFIKS]

  • -a, --multiple — pozwala podać wiele ścieżek naraz; każdy argument jest traktowany jako osobna nazwa.
  • -s SUFIKS, --suffix=SUFIKS — usuwa wskazany przyrostek (np. rozszerzenie) z każdej nazwy; automatycznie włącza tryb -a.
  • -z, --zero — kończy każdą linię bajtem NUL zamiast znakiem nowej linii (przydatne w parze z xargs -0).
  • --help — wyświetla skróconą pomoc i listę opcji.
  • --version — pokazuje wersję narzędzia (część pakietu GNU coreutils).

Bez opcji -s drugi argument działa jak sufiks do usunięcia: basename ŚCIEŻKA SUFIKS.

Przykłady użycia

  • basename /usr/bin/sort — zwraca sort, czyli samą nazwę pliku bez katalogów.
  • basename /home/user/raport.csv .csv — zwraca raport, bo zdejmuje rozszerzenie podane jako drugi argument.
  • basename -s .tar.gz backup-2026.tar.gz — zwraca backup-2026; opcja -s czyści złożony przyrostek.
  • basename -a /tmp/a.log /var/b.log — wypisuje a.log i b.log w osobnych liniach, przetwarzając obie ścieżki za jednym wywołaniem.
  • name=$(basename "$0") — w skrypcie wyciąga nazwę samego skryptu, żeby ładnie ją pokazać w komunikatach.

Częste błędy i pułapki

Po pierwsze: basename to operacja czysto tekstowa na łańcuchu znaków — nie sprawdza, czy plik w ogóle istnieje. Literówka w ścieżce przejdzie bez słowa skargi. Po drugie, sufiks musi pasować dokładnie: basename plik.JPG .jpg nie obetnie nic, bo wielkość liter ma znaczenie. Uważaj też, żeby nie zdjąć całej nazwy — basename .bashrc .bashrc zwróci .bashrc, bo narzędzie nie pozwala wyzerować nazwy do pustego ciągu. Ścieżki ze spacjami zawsze bierz w cudzysłów (basename "$plik"), inaczej powłoka rozbije je na kawałki.

Różnice między systemami: wersja GNU (typowy Linux) ma -a, -s i -z. Na macOS i innych BSD basename również wspiera -a oraz -s, ale flagi -z tam nie znajdziesz — jeśli piszesz przenośny skrypt, nie zakładaj jej obecności.

Powiązane komendy: dirname (zwraca odwrotność — samą ścieżkę katalogu), readlink -f (pełna ścieżka kanoniczna), realpath, oraz parametry powłoki ${zmienna##*/} i ${zmienna%.*} robiące to samo bez uruchamiania procesu.