Como descobrir se dois diretórios apontam para o mesmo local

7

Os seguintes caminhos apontam para o mesmo local de disco?

/home/username
/app/home/username
    
por Mykhaylo Adamovych 02.06.2015 / 09:51

6 respostas

4

Altere o diretório para cada um deles e observe a saída de pwd -P . Com o sinal -P , pwd exibirá o diretório de trabalho atual físico com todos os links simbólicos resolvidos.

    
por 02.06.2015 / 16:11
3
sd(){       set '' "$1" '' "${2?sd() requires two arguments!}"
            while [ "$#" -gt 2 ]
            do    [  "${1:--L}" "${2:--L}" ${3:+"$4"} ] &&
                  [  "${1:--L}" ${3:+"-L"} "${3:-$4}" ] &&
                  [  "${2:-$3}" -ef "$4"/. ] && return  || ${1:+"return"}
                  set "$@" "$2";shift 2;set ! "$@"
            done  3>/dev/null 2>&"$((${#DBG}?2:3))"
    }

sd() Primeiro verifica se ambos os seus argumentos são links simbólicos e, em caso afirmativo, ele verifica se ambos estão vinculados a diretórios com números de inode e de dispositivo idênticos. Em caso afirmativo, sd() return s true

Em caso negativo, verifica se ambos são não links simbólicos e, novamente, se ambos são diretórios com números iguais de dispositivo e inode. Caso contrário, retorna falso.

Então ...

ln -s dir1 ln3; ln -s dir1 ln4; ln -s dir2 ln5

sd dir1 dir2; echo $?
1
sd dir1 ln3;  echo $?
1
sd ln4 ln3;   echo $?
0
sd ln4 ln5;   echo $?
1
mount --bind dir1 dir2
sd dir1 dir2; echo $?
0

Pode ser desejável fazer sem a verificação de link - por exemplo, se você quisesse saber se o destino de um link era o mesmo que algum diretório, ou simplesmente não se importaria se fosse um link. Nesse caso, você só precisaria do teste [ fname1 -ef fname2 ] .

Oh, eu também devo mencionar que isso pressupõe permissões de pesquisa para todos os argumentos. Ele falhará se o usuário solicitante não tiver as permissões necessárias para executar o teste.

    
por 02.06.2015 / 11:47
1

Você nunca pode ter certeza de qual mecanismo ou sistemas de arquivos virtuais ou sistemas de arquivos de sobreposição existem, para sincronizar essas pastas ou vincular uma a outra. Se é um simples link simbólico, os inodes diferem. Para ter 100% de certeza de que é o mesmo local, você pode criar um arquivo em /home/username :

touch /home/username/.testfile

Em seguida, compare os números de inode desse arquivo em ambos os locais:

diff <(stat -c "%i" /home/username/.testfile) <(stat -c "%i" /app/home/username/.testfile)

Se eles são iguais, então é o mesmo arquivo, portanto eles apontam para o mesmo local.

Bem, mesmo com isso você não pode ter 100% de certeza. É claro que eles podem ter o mesmo número de inode por pura coincidência, porque em ambos os filesytems o próximo inode livre tinha o mesmo número ...

    
por 02.06.2015 / 10:35
0

Assumindo que /home/username e /app/home/username são diretórios, você não pode verificar o número do inode para ver se eles são o mesmo caminho. Isto porque os diretórios não podem ser hardlinked, e os soft links possuem um inode diferente.

Você pode usar cd /home/username , touch a um arquivo e ver se ele aparece no outro /app/home/username . Existem provavelmente métodos melhores, se alguém puder vir com uma resposta melhor, por favor, vá em frente.

    
por 02.06.2015 / 10:35
0

Expandindo o que marco disse: no GNU / Linux ls -li /home/username /app/home/username já dará você é uma boa dica . Se ambos os inodes forem iguais, eles apontam para o mesmo local. Verifique novamente com mount . Triplo verifique por touch -ing um arquivo em /home/username e veja se ele aparece em /app/home/username e com o mesmo inode. Então pode ter certeza que é o mesmo diretório.

Teste feito em uma máquina Linux Mint, kernel 3.11.0-12-genérico:

# ls -ldi /var
2 drwxr-xr-x 13 root root 4096 jan 13  2014 /var

# mkdir /mnt/var
# ls -ldi /mnt/var
266483 drwxr-xr-x 2 root root 4096 jun  2 10:43 /mnt/var

# mount --bind /var /mnt/var
# ls -ldi /mnt/var
2 drwxr-xr-x 2 root root 4096 jun  2 10:43 /mnt/var

# umount /mnt/var
# mount /dev/mapper/mint--vg-var /mnt/var
# ls -ldi /mnt/var
2 drwxr-xr-x 13 root root 4096 jan 13  2014 /mnt/var

Conclusão: Eu acho que você pode verificar os inodes para ter certeza de que os dois diretórios são idênticos, desde que sejam pontos de montagem. Se um é um link simbólico, o acima não se aplica, é claro. Mas então é óbvio, certo:

# rmdir /mnt/var
# ln -s /var /mnt/
# ls -ldi /mnt/var
266483 lrwxrwxrwx 1 root root 4 jun  2 10:51 /mnt/var -> /var
    
por 02.06.2015 / 10:53
0

Existem duas maneiras básicas de verificar se dois arquivos são iguais. O primeiro deles é verificar se seus caminhos são os mesmos . Isso não tem falsos positivos, mas muitos falsos negativos. Um caso óbvio de falsos negativos é se os links simbólicos estão envolvidos. Você pode lidar com esse caso resolvendo os links simbólicos. Para diretórios existentes que você tem permissão para alterar, isso pode ser feito com pwd -P .

absolute_path1="$(cd -- "$path1" && pwd -P; echo .)" &&
absolute_path2="$(cd -- "$path2" && pwd -P; echo .)" &&
[ "$absolute_path1" = "$absolute_path2" ]

O echo . extra cuida do caso raro em que um dos destinos tem um nome de arquivo que termina com uma nova linha: se a nova linha fosse o último caractere da substituição do comando, ele seria removido, portanto o snippet seria incorretamente relate que foo␤ é o mesmo que foo .

Ainda há possíveis falsos negativos. Com os diretórios, os hard links não são uma preocupação, porque a maioria dos sistemas operacionais e sistemas de arquivos proíbem diretórios de hard-linking. O que pode acontecer é que o mesmo diretório seja disponibilizado de alguma forma em locais diferentes, como:

  • montando o mesmo sistema de arquivos remoto em dois locais diferentes, por exemplo

    mount server:/some/where /mnt1
    mount server:/some/where /mnt2
    compare /mnt1 /mnt2
    
  • Uma vincular montagem

  • Qualquer sistema de arquivos empilhável, ou seja, uma maneira de apresentar um sistema de arquivos de uma maneira diferente, onde você considera que a exibição do diretório está suficientemente inalterada em relação ao original, sendo efetivamente o mesmo diretório. Por exemplo, um sistema de arquivos empilhável que converte nomes de arquivos e o nome do diretório é invariante sob a conversão.

Nestes exemplos, é discutível se os diretórios são realmente os mesmos. Isso mostra o limite da noção de “mesmo arquivo” nos casos de borda.

A segunda maneira básica é verificar a identificação fornecida pelo kernel: device e inode . A stat chamada do sistema relata dois atributos para cada arquivo:

  • o número do dispositivo ( st_dev ), que é tradicionalmente uma identificação do dispositivo de bloco (partição de disco) que contém o sistema de arquivos no qual o arquivo está;
  • o número do inode ( st_ino ), que é tradicionalmente um número exclusivo que identifica o arquivo no mesmo sistema de arquivos.

Normalmente, dois arquivos são idênticos se e somente se eles tiverem o mesmo número de dispositivos e inode. Dash, ksh, bash, zsh e pelo menos algumas construções do BusyBox (mas não simples POSIX sh) têm um operador -ef para o test embutido que testa isso:

[ "$path1" -ef "$path2" ]

Isso lida corretamente com links físicos e links simbólicos (links simbólicos são seguidos, ou seja, um link simbólico para um arquivo é considerado o mesmo que o arquivo de destino).

Este método é o mais simples de executar, se o seu shell (ou o utilitário test ) suportar -ef . Mas tenha cuidado com os falsos positivos, porque nem todos os sistemas de arquivos relatam números únicos de inode. Por exemplo, com sistemas de arquivos de rede, você fica à mercê da escolha de números de inode do host remoto. Muitos sistemas de arquivos empilháveis relatam o inode subjacente, que não é exclusivo se a árvore de diretórios subjacente abranger vários sistemas de arquivos.

Uma abordagem diferente é testar a equivalência observável : modificar um dos diretórios e ver se a modificação é refletida no outro. Essa abordagem não tem, em princípio, falsos negativos, mas requer permissão para modificar os diretórios e pode atrapalhar outras partes do sistema que estão usando esses diretórios. Pode haver falsos positivos, porque ver as modificações refletidas pode indicar que há um daemon sincronizando os diretórios muito rapidamente.

    
por 04.06.2015 / 01:27