Mam skrypt do rekurencyjnego tworzenia dowiązań symbolicznych w moim katalogu domowym do katalogu ustawień, aby pliki były pod kontrolą wersji. Chciałbym, aby pomijał pliki, które są już dowiązane symbolicznie przez katalog nadrzędny. To znaczy, jeśli mam te pliki / katalogi:
~/foo/ -> ~/settings/foo/
~/settings/foo/
~/settings/foo/bar
, jak sprawdzić, czy ~ / foo / bar i ~ / settings / foo / bar są tym samym plikiem?
Edytuj : D'oh, kolejne kilka minut poszukiwań ujawniło odpowiedź :readlink -f $path
linux
symbolic-link
l0b0
źródło
źródło
stat -L
.Wiele powłok ma
-ef
operatoratest
wbudowanego (lub jego synonimu[
), który sprawdza, czy dwie ścieżki wskazują na ten sam istniejący plik (następujące dowiązania symboliczne). Dotyczy to bash, dash, pdksh, ksh88, ksh93 i zsh, ale nie POSIX sh. W bash, ksh lub zsh możesz także użyć-ef
w[[ … ]]
konstrukcji warunkowej.źródło
-ef
ma tę zaletę, że jest bardziej przenośny (również nieco szybszy, ale nie tak, abyś zauważał większość czasu). Na przykład działa na * BSD, OSX, BusyBox, a także Linux / Cygwin (GNU). Jest również jaśniejszy, ponieważ robi dokładnie to, co jest wymagane. Jedyną zaletą, którą widzę w połączeniu,stat
jest to, że nie chcesz podążać za dowiązaniami symbolicznymi.Do softlinków (utworzonych przy pomocy
ln -s
) możesz użyćrealpath
. Nie zadziała to jednak w przypadku dowiązań twardych.źródło