Como posso verificar se /my/dir
está na mesma partição que /
?
Isto é para integração dentro de um script. As montagens de ligação devem ser manuseadas corretamente. As soluções compatíveis com POSIX são bem-vindas.
shell-script
mount
Totor
fonte
fonte
Respostas:
Você pode verificar isso com stat:
Mostra o número do dispositivo e onde seu diretório foi montado.
fonte
stat
comando shell não é POSIX ...O comando a seguir fornece um nome exclusivo para o ponto de montagem que contém o arquivo
$file
:Isso funciona em qualquer sistema POSIX . A
-P
opção impõe um formato previsível; o primeiro campo da segunda linha é o "nome do sistema de arquivos". Portanto, para verificar dois arquivos estão no mesmo ponto de montagem:Ou, para salvar algumas invocações de processo:
Alguns sistemas operacionais podem ter espaços nos nomes dos volumes. Não há uma maneira completamente confiável de analisar a
df
saída neste caso.Sob o capô, você pode identificar o sistema de arquivos que contém um arquivo pelo
st_dev
campo retornado porstat
. Não há maneira portátil de fazer isso a partir de um script de shell. Alguns sistemas têm umstat
utilitário, mas sua sintaxe varia:stat
relata ost_dev
campo quando chamado comostat -c %D -- "$file"
.stat
compatível com os coreutils GNU. Outros têmstat
sem a%c
opção; você pode usar,stat -t -- "$file" | awk '{print $8}'
mas isso só funcionará se o nome do arquivo não contiver espaço em branco oustat -t -- "$file" | awk 'END {print $(NF-8)}'
lidar com nomes arbitrários de arquivos, mas não com futuras adições de campos àstat
saída.stat
utilitário diferente que requerstat -f %d -- "$file"
.stat
utilidade.Se o Perl estiver disponível, você poderá usar
e para fazer a comparação:
Observe que existem alguns casos de canto em que o resultado desejado não é claro. Por exemplo, com montagens bind do Linux, depois de
mount --bind /foo /bar
,/foo
e/bar
são considerados o mesmo sistema de arquivos. Sempre é possível que os dois arquivos estejam realmente localizados no mesmo dispositivo, mas você nunca saberá: por exemplo, se os arquivos estiverem em duas montagens de rede diferentes, o cliente não terá como saber se o servidor está exportando sistemas de arquivos diferentes.Se os arquivos são diretórios e você pode gravá-los, outro método é criar um arquivo temporário e tentar criar um link físico. Este relata um resultado negativo nas montagens de ligação do Linux.
fonte
df
nem sempre fornece o nome do dispositivo, mas às vezes um link simbólico para ele, como/dev/disk/by-uuid/ca09b761-ae1b-450f-8a46-583327b48fb4
tornardf
não confiável. Até agora, a única opção confiável é usar umastat
solução baseada em.df
relatado para o dispositivo, ele é consistente entre as duas invocações; portanto, é bom fazer uma comparação.df
relatório/dev/sda6
e/dev/disk/by-uuid/ca09b...
, ambos referentes ao mesmo dispositivo, mas com pontos de montagem diferentes. O teste de comparação de cadeias obviamente falha ao tentar com arquivos de cada ponto de montagem.mount /dev/sda6 /mnt1
seguido demount /dev/sda6 /mnt2
trabalhos como um encanto.cat /proc/mounts
está bem com isso. No entanto, somente a partir do Wheezy/dev/disk/by-uuid/ca09b...
é mostradadf
como o dispositivo para o sistema de arquivos raiz. Tentativas adicionais de montá-lo usando este simlink ou aUUID=ca09b...
sintaxe mount não terminam mostrando nada além de/dev/sda6
indf
(não sei como reproduzir o que ele fez durante o processo de inicialização, mas essa não é a preocupação aqui).Funciona com qualquer número de caminhos.
fonte
df
é não sempre uma boa idéia .$6
), não o nome do dispositivo ($1
), para que não seja um problema.A melhor solução infalível disponível no POSIX é a comparação dos IDs de dispositivos dos arquivos fornecidos pela função stat (2) .
Perl tem uma função stat semelhante à que Gilles apontou :
mas a "maneira POSIX" é usar um programa C como:
qual código fonte é o seguinte:
Se os IDs de dispositivo dos dois arquivos forem iguais, eles serão hospedados no mesmo sistema de arquivos; nesse caso, os comandos acima retornarão 0 (outro valor, caso contrário). Verifique com
echo $?
.Isso funciona bem com montagens de ligação, mas provavelmente não funcionará com montagens de rede.
fonte