Verifique se dois caminhos estão apontando para o mesmo arquivo

11

Eu tenho um script para recursivamente criar links simbólicos no meu diretório home para o meu diretório de configurações, para manter os arquivos sob controle de versão. Eu gostaria que ele ignorasse os 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 posso verificar se ~ / foo / bar e ~ / settings / foo / bar são o mesmo arquivo?

Editar : Outros minutos de pesquisa revelaram resposta : readlink -f $path

    
por l0b0 06.10.2010 / 18:03

3 respostas

6

Se dois arquivos tiverem o mesmo deviceID e inode, eles são o mesmo arquivo. A ferramenta de linha de comando stat facilita a localização

if [ "$(stat -c "%d:%i" FILE1)" == "$(stat -c "%d:%i" FILE2)" ]'

...

isso funciona para arquivos com links simbólicos ou arquivos com link físico.

    
por 06.10.2010 / 20:59
16

Muitos shells têm um operador -ef para o test builtin (ou seu sinônimo [ ) para testar se dois caminhos apontam para o mesmo arquivo existente (seguindo links simbólicos). Isso inclui bash, dash, pdksh, ksh88, ksh93 e zsh, mas não POSIX sh. No bash, ksh ou zsh, você também pode usar -ef na construção condicional [[ … ]] .

if ! [ "$1" -ef "$2" ]; then # $1 and $2 are different files
    
por 06.10.2010 / 22:19
0

Para softlinks (criados com ln -s ), você pode usar realpath . Isso não funcionará para hardlinks.

    
por 06.10.2010 / 18:22