Przejdź do głównej zawartości

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).

Okno terminala
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.

ParametrOpis
-z, --zeroZakończa każdy wynik znakiem NUL (\0) zamiast nowej linii – przydatne w pętlach xargs (-0).
--helpWyświetla krótką pomoc.
--versionDrukuje wersję programu.

Okno terminala
# 1. Pojedyncza ścieżka pliku
dirname /var/log/nginx/access.log #=> /var/log/nginx
# 2. Wyodrębnienie katalogu z bieżącej ścieżki skryptu
SCRIPT_DIR="$(dirname "$0")"
# 3. Przetwarzanie wielu ścieżek ze znakiem NUL
printf '%s\0' \
/etc/ssh/sshd_config \
/usr/local/bin/myscript \
| dirname -z | tr '\0' '\n'
# 4. Łączenie z basename do zmiany rozszerzenia
file=/path/to/photo.jpg
dir=$(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 z IFS=/ lub funkcji powłoki.
  • Bezpieczeństwo w skryptach: Cytuj zmienne ("$(dirname "$path")"), aby obsłużyć spacje i znaki specjalne.

Błąd / KomunikatPrzyczynaRozwiązanie
Brak outputu lub tylko kropkaŚcieżka nie zawiera ukośnikaSprawdź argument; dodaj / jeśli oczekujesz katalogu.
Nieobsługiwana opcja -zStarsza lub minimalistyczna implementacja (BusyBox)Zaktualizuj coreutils lub użyj metody z cut/${var%/*}.
Wynik zawiera dwukrotne „//”Podwójne ukośniki w argumencieUżyj readlink -f do normalizacji lub sed 's#/\{2,}#/#g'.