Szukam prostego polecenia, którego można użyć w Bash, aby znaleźć absolutną i kanonizowaną ścieżkę do pliku w systemie OS X (podobnym do `` readlink -f '' w systemie Linux).
Następująca przykładowa sesja bash opisuje [fikcyjne] narzędzie o nazwie `` abspath '', które wykazuje pożądane zachowanie:
$ pwd
/Users/guyfleegman
$ ls -lR
drwxr-xr-x 4 guyfleegman crew 136 Oct 30 02:09 foo
./foo:
-rw-r--r-- 1 guyfleegman crew 0 Oct 30 02:07 bar.txt
lrwxr-xr-x 1 guyfleegman crew 7 Oct 30 02:09 baz.txt -> bar.txt
$ abspath .
/Users/guyfleegman
$ abspath foo
/Users/guyfleegman/foo
$ abspath ./foo/bar.txt
/Users/guyfleegman/foo/bar.txt
$ abspath foo/baz.txt
/Users/guyfleegman/foo/baz.txt
Podobnie jak w przypadku ostatniego wywołania `` abspath '' w powyższym przykładzie, wolałbym, aby nie rozpoznawał automatycznie dowiązań symbolicznych, ale nie będę tutaj zbyt wybredny.
macos
osx-snow-leopard
bash
shell
Michael Wehner
źródło
źródło
Odpowiedzi:
Przykłady:
źródło
Nie sądzę, że istnieje wbudowane polecenie, które to robi. Jesse Wilson napisał do tego skrypt bash:
Jednak nie działa dobrze w przypadku ścieżek bezpośrednio poniżej
/
, takich jak/etc
(drukowanie//etc
), a także.
i..
(drukowanie/cwd/.
w obu przypadkach). Próbowałem to zmodyfikować, ale moje niewystarczające bash-fu mnie zawiodło.Oto moja sugestia:
Zapisz jako
/usr/bin/abspath
lub coś w tym stylu i uczyń go wykonywalnym. Przykładowe dane wyjściowe:Jeśli zrobić chcą rozdzielczość symlink, zmienić
print
linię:aby to uzyskać:
źródło
file /usr/bin/xattr
Jedną z opcji byłoby po prostu zainstalowanie coreutils i użycie
greadlink -f
. Rozwiązuje dowiązania symboliczne i działa z/Foo/
lub~/foo.txt
jeśli nie istnieją, ale nie z/Foo/foo.txt
jeśli/Foo/
nie istnieje.Nie rozwiązuje to dowiązań symbolicznych i nie działa z
/Foo/foo.txt
żadnym z nich.dirs -l
wykonuje rozwinięcie tyldy.dirs +0
drukuje tylko najwyższy katalog, jeśli na stosie znajdują się inne katalogi.źródło
Myślę, że możesz to zrobić za pomocą Pythona lub Ruby.
lub uczyń to poleceniem za pomocą
źródło
Jeśli masz zainstalowany moduł Perla :: File :: Spec, możesz po prostu to zrobić:
źródło
W przypadku skryptów bash / sh możesz użyć tej funkcji rekurencyjnej:
źródło
__filename
. Skrypt i tak zachowuje się bardziej podobniedirname
.Zainstaluj następującą bibliotekę dla OSX:
źródło
Jeśli instalacja coreutils nie jest opcją, poniższe polecenia obsługują kombinacje dowiązań symbolicznych,. i .. i działa na plikach i folderach takich jak GNU realpath:
Ale nie obsługuje realpath - w odniesieniu do. Wymagałoby to https://stackoverflow.com/a/12498485/869951 .
źródło
Biorąc pod uwagę, że ograniczeniem jest MacOS (w tym czasie OS X), PHP jest domyślnie dostępne. Spowoduje to zwrócenie katalogu głównego pliku. Usuń również,
dirname
aby pobrać plik.źródło