dirname
- dirname – program z pakietu GNU coreutils (oraz standardu POSIX) zwracający komponent katalogu ze ścieżki plikowej, czyli wszystko przed ostatnim ukośnikiem (
/
). - Używany w skryptach powłoki do wyodrębniania bazowych katalogów, łączenia ścieżek, przygotowywania zmiennych środowiskowych i operacji instalacyjnych.
- Dostępny domyślnie w większości systemów Unix/Linux, macOS, BSD oraz BusyBox; substytuty w Windows (msys2, git‑bash).
Składnia
Dział zatytułowany „Składnia”dirname [opcje] <ścieżka> [<ścieżka> ...]
- Jeśli podasz wiele operandów,
dirname
wypisze wynik dla każdej ścieżki w osobnej linii (lub NULL przy-z
). - Przy braku ukośnika w argumencie zwraca pojedynczą kropkę (
.
) oznaczającą katalog bieżący.
Parametry
Dział zatytułowany „Parametry”Parametr | Opis |
---|---|
-z , --zero | Zakończa każdy wynik znakiem NUL (\0 ) zamiast nowej linii – przydatne w pętlach xargs (-0 ). |
--help | Wyświetla krótką pomoc. |
--version | Drukuje wersję programu. |
Przykłady użycia
Dział zatytułowany „Przykłady użycia”# 1. Pojedyncza ścieżka plikudirname /var/log/nginx/access.log #=> /var/log/nginx
# 2. Wyodrębnienie katalogu z bieżącej ścieżki skryptuSCRIPT_DIR="$(dirname "$0")"
# 3. Przetwarzanie wielu ścieżek ze znakiem NULprintf '%s\0' \ /etc/ssh/sshd_config \ /usr/local/bin/myscript \ | dirname -z | tr '\0' '\n'
# 4. Łączenie z basename do zmiany rozszerzeniafile=/path/to/photo.jpgdir=$(dirname "$file")base=$(basename "$file" .jpg)echo "$dir/$base.png" #=> /path/to/photo.png
- Brak analizy rzeczywistego systemu plików:
dirname
działa czysto na ciągu znaków – nie sprawdza istnienia plików ani uprawnień. - Zachowanie przy ukośniku końcowym: Dla ścieżek zakończonych
/
nadmiarowe ukośniki są ignorowane (/usr/local/
→/usr
). - Zgodność POSIX: Opcja
-z
jest rozszerzeniem GNU; w czystym POSIX‑sh użyj pętli zIFS=/
lub funkcji powłoki. - Bezpieczeństwo w skryptach: Cytuj zmienne (
"$(dirname "$path")"
), aby obsłużyć spacje i znaki specjalne.
Najczęściej spotykane błędy i jak je naprawić
Dział zatytułowany „Najczęściej spotykane błędy i jak je naprawić”Błąd / Komunikat | Przyczyna | Rozwiązanie |
---|---|---|
Brak outputu lub tylko kropka | Ścieżka nie zawiera ukośnika | Sprawdź argument; dodaj / jeśli oczekujesz katalogu. |
Nieobsługiwana opcja -z | Starsza lub minimalistyczna implementacja (BusyBox) | Zaktualizuj coreutils lub użyj metody z cut /${var%/*} . |
Wynik zawiera dwukrotne „//” | Podwójne ukośniki w argumencie | Użyj readlink -f do normalizacji lub sed 's#/\{2,}#/#g' . |
Linki i źródła
Dział zatytułowany „Linki i źródła”- man dirname – oficjalna dokumentacja.
- GNU coreutils – dirname – pełny manual online.
- BashFAQ/028 – Manipulacja ścieżkami w Bash – alternatywy w powłoce.