Eu tenho um script para criar recursivamente links simbólicos no meu diretório pessoal para o meu diretório de configurações, para manter os arquivos sob controle de versão. Gostaria de pular arquivos que já estão vinculados por meio de um diretório pai. Ou seja, se eu tiver esses arquivos / diretórios:
~/foo/ -> ~/settings/foo/
~/settings/foo/
~/settings/foo/bar
, como verifico se ~ / foo / bar e ~ / settings / foo / bar são o mesmo arquivo?
Edit : D'oh, mais alguns minutos de pesquisa revelaram a resposta :readlink -f $path
linux
symbolic-link
l0b0
fonte
fonte
stat -L
.Muitos shells possuem um
-ef
operador para otest
builtin (ou seu sinônimo[
) para testar se dois caminhos apontam para o mesmo arquivo existente (seguindo os links simbólicos). Isso inclui bash, dash, pdksh, ksh88, ksh93 e zsh, mas não o POSIX sh. No bash, ksh ou zsh, você também pode usar-ef
na[[ … ]]
construção condicional.fonte
-ef
tem a vantagem de ser mais portátil (também um pouco mais rápido, mas não para que você perceba na maioria das vezes). Por exemplo, ele funciona em * BSD, OSX, BusyBox e também em Linux / Cygwin (GNU). Também é mais claro, pois faz exatamente o que é necessário. A única vantagem que posso ver para ligarstat
é quando você não deseja seguir links simbólicos.Para softlinks (criados com
ln -s
) você pode usarrealpath
. Porém, isso não funcionará para hardlinks.fonte