realpath

Rozwiązuje pełną, kanoniczną ścieżkę bezwzględną do pliku (z rozwinięciem dowiązań).

realpath bierze dowolną ścieżkę — względną, z dowiązaniami symbolicznymi, z kropkami . i .. — i zamienia ją na jedną, kanoniczną ścieżkę bezwzględną. Innymi słowy: mówisz mu „gdzie tak naprawdę jest ten plik?”, a on rozwija wszystkie skróty i symlinki i daje konkretną odpowiedź od korzenia /. To narzędzie z pakietu GNU coreutils, więc znajdziesz je praktycznie na każdym Linuksie. Bezcenne w skryptach, gdzie nie chcesz zgadywać, czy ktoś odpalił Cię z innego katalogu.

Składnia i najważniejsze opcje

Podstawowa forma to realpath [OPCJE] PLIK... — możesz podać jeden lub wiele plików naraz.

  • -e, --canonicalize-existing — wszystkie komponenty ścieżki muszą istnieć, inaczej błąd.
  • -m, --canonicalize-missing — żaden komponent nie musi istnieć (przydatne, gdy budujesz ścieżkę pod plik, którego jeszcze nie ma).
  • -s, --strip, --no-symlinks — nie rozwijaj dowiązań symbolicznych, tylko uporządkuj ścieżkę.
  • --relative-to=DIR — wypisz wynik jako ścieżkę względną do podanego katalogu.
  • --relative-base=DIR — ścieżki w obrębie DIR pokaż względnie, resztę bezwzględnie.
  • -z, --zero — kończ każdą linię bajtem NUL zamiast nową linią (do xargs -0).
  • -q, --quiet — wycisz komunikaty o błędach.
  • -L, --logical / -P, --physical — przetwarzaj .. przed dowiązaniami / rozwijaj dowiązania (domyślne).

Przykłady użycia

  • realpath plik.txt — pokaże pełną ścieżkę bezwzględną do pliku w bieżącym katalogu.
  • realpath ../logi/./app.log — uprzątnie .. i . i da czystą ścieżkę kanoniczną.
  • realpath /var/log/syslog — jeśli to symlink, zobaczysz, do jakiego prawdziwego pliku prowadzi.
  • realpath -m /opt/app/cache/nowy.tmp — zwróci pełną ścieżkę, nawet gdy plik jeszcze nie istnieje.
  • realpath --relative-to=/home/jan ~/projekty/api — pokaże ścieżkę względną, np. projekty/api.

Częste błędy i pułapki

Po pierwsze: na macOS i BSD realpath bywa inny niż wersja GNU — część flag (np. --relative-to) tam nie istnieje. Jeśli piszesz przenośny skrypt, sprawdź, z czym masz do czynienia, albo użyj readlink -f. Po drugie: bez -m wskazanie nieistniejącego pliku skończy się błędem i pustym wynikiem — łatwo się na tym przejechać w skryptach, które dopiero tworzą pliki. Po trzecie: pamiętaj, że -s NIE rozwija symlinków, więc jeśli zależy Ci na „prawdziwej” lokalizacji za dowiązaniem, tej flagi nie używaj. I drobiazg: realpath niczego nie zmienia na dysku — tylko liczy i wypisuje ścieżkę, więc możesz go odpalać bez stresu.

Powiązane komendy: readlink, dirname, basename, pwd, cd.