dirname

Zwraca ścieżkę katalogu z pełnej ścieżki pliku.

dirname to mała komenda z pakietu GNU coreutils, która ze ścieżki wycina ostatni człon (nazwę pliku albo katalogu) i zwraca to, co zostało — czyli katalog nadrzędny. Dajesz jej /etc/nginx/nginx.conf, dostajesz /etc/nginx. Jest czysto tekstowa: nie sprawdza, czy plik istnieje, tylko mechanicznie tnie napis po znakach /. Dlatego idealnie nadaje się do skryptów, gdzie musisz dobrać się do folderu, w którym leży dany plik.

Składnia i najważniejsze opcje

Podstawowa forma: dirname [OPCJE] ŚCIEŻKA...

  • -z, --zero — kończy każdą linię wyjścia znakiem NUL zamiast nową linią. Przydatne, gdy wynik podajesz do xargs -0 i obawiasz się spacji w nazwach.
  • --help — wyświetla krótką pomoc i kończy działanie.
  • --version — pokazuje wersję coreutils.

To w zasadzie cały arsenał — dirname nie ma dziesiątek flag, bo robi jedną rzecz. Za to przyjmuje wiele argumentów naraz: dirname a/b c/d zwróci dwie linie, a i c.

Przykłady użycia

  • dirname /var/www/learningzone.pl/index.php — zwróci /var/www/learningzone.pl, czyli katalog z plikiem.
  • cd "$(dirname "$0")" — klasyk na początku skryptu: przeskakuje do katalogu, w którym leży sam skrypt, niezależnie skąd go uruchomiono.
  • dirname /etc/nginx/ — uwaga, końcowy ukośnik jest obcinany, więc dostaniesz /etc, a nie /etc/nginx.
  • dirname plik.txt — gdy w ścieżce nie ma żadnego /, zwraca . (bieżący katalog).
  • dirname log/a.txt log/b.txt — przetworzy obie ścieżki, drukując log w dwóch liniach.

Częste błędy i pułapki

Najczęstsza wpadka to brak cudzysłowów. Jeśli ścieżka zawiera spację, jak dirname /home/jan/moje pliki/raport.txt, powłoka potraktuje to jako dwa osobne argumenty i wynik cię zaskoczy. Zawsze pisz dirname "$zmienna".

Druga pułapka: dirname nie waliduje istnienia ścieżki — chętnie zwróci katalog dla pliku, którego nie ma. To narzędzie do parsowania tekstu, nie do sprawdzania systemu plików.

Pamiętaj też, że to komenda zewnętrzna, a nie składnia powłoki. W bashu szybsze bywa rozwinięcie ${ZMIENNA%/*}, które robi podobną rzecz bez odpalania procesu. Drobna różnica między systemami: na minimalnych obrazach (np. starsze BusyBox) dirname może nie znać opcji -z — to rozszerzenie GNU.

Powiązane komendy: basename (robi odwrotność — zwraca samą nazwę pliku), realpath i readlink -f (rozwijają ścieżkę do pełnej, kanonicznej postaci), oraz pwd.