Respostas:
Como Stephane diz "não existe uma resposta universal do Unix para isso".
A melhor solução que encontrei para minha pergunta:
df -P -T /my/path/to/folder | tail -n +2 | awk '{print $2}'
retornará o tipo de sistema de arquivos, por exemplo: nfs
ou ext3
.
A -T
opção não é padrão , portanto, pode não funcionar em outros sistemas Unix / Linux ...
De acordo com o comentário de Gilles abaixo: "Isso funciona em qualquer Linux não incorporado, mas não no BusyBox, * BSD etc."
/etc/mtab
ou os resultados de, em mount
vez de usar, df
podem ocorrer em mais alguns casos.
/proc/mounts
mount
, nem /etc/mtab
, nem mesmo /proc/mounts
são padrão por isso não há garantia sobre o que pode ser encontrado lá ...
-T
ter um significado diferente aqui
Você poderia usar o GNU stat
.
%m
para descobrir o ponto de montagem.
$ stat --format=%m /usr/src/linux
/usr/src
%T
(no modo de sistema de arquivos) para descobrir o nome do sistema de arquivos.
$ stat --file-system --format=%T /usr/src/linux
reiserfs
Portanto, você sabe que /usr/src/linux
, no meu sistema, é armazenado em um sistema de arquivos montado /usr/src
e com o tipo de sistema de arquivos reiserfs
.
Consulte também man stat
para referência adicional. É um comando muito versátil, útil quase sempre quando você precisa de informações sobre arquivos e não deseja voltar ao estado de grep | awk
guarda.
stat
não possui a %m
opção de --format
(usando Debian Squeeze, coreutils 8.5). Então, acho que essa solução não é muito confiável.
2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file
. Isso é quase 3 anos atrás. Surpreendente que o Debian ainda não tenha isso.
mount -l
e use grep
,, sed
ou awk
para encontrar a linha que se refere ao diretório em questão.
/my/path/to/the/directory
na verdade, é algo do ponto de montagem /my/path
com sua resposta. Talvez você pode dar mais alguns detalhes sobre o grep
, sed
, awk
comandos você sugere (a resposta completa) ?.
mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'
deve fornecer uma lista de todos os pontos de montagem do nfs no sistema.
mount | fgrep "`stat --printf=" on %m type" /var/log/`". The
comando stat: mount` imprimirá todos os pontos de montagem, no <device> on <mountpoint> type <type>
formato. Para grep isso, eu stat --printf
gerei a on <mountpoint> type
parte.
Infelizmente, não existe uma resposta universal do Unix para isso.
Uma coisa que você pode fazer, pois um determinado arquivo /a/b/c/d
é percorrer o caminho:
... e faça um stat(2)
em cada nível, até as st_dev
mudanças. Então você saberá onde está o ponto de montagem. Em seguida, você pode procurar o caminho canônico desse ponto de montagem /etc/mtab
ou na saída de mount
para descobrir o tipo de sistema de arquivos. Então descobrir o que é remoto e o que não é será complicado, especialmente para os do tipo fusível. Por exemplo, nfs
, cifs
, fuse.sshfs
, fuse.davfs
são óbvias, mas o que acontece, por exemplo, fuse.gvfs-fuse-daemon
ou fuse.avfsd
que podem ter ambos os arquivos de rede e fora da rede?
stat(2)
, acho que você está se referindo à função C, mas estou usando shell. No entanto, st_dev
refere-se ao ID principal e secundário do dispositivo (é específico do Linux?), E o comando shell stat(1)
possui (não-padrão) %t
e %T
com as --format
opções para números maiores e menores, respectivamente, mas sempre retorna "0" (local e nfs ) Eu experimentei o Debian Squeeze e o Lenny.
--file-system
opção?
--file-system
.
O "-l" para df (1) falhará com um erro em sistemas de arquivos não locais, portanto você pode usar esse comportamento para saber se o sistema de arquivos é remoto:
df -l /path 2> /dev/null | grep -q "File"
rc=$?
if [ "$rc" = "0" ]
then
echo "local mount, do stuff"
fi
df
falharia e isso por si só não é uma resposta muito boa, mas está tentando responder à pergunta, então não vejo por que você a chamaria de "não uma resposta".
Você pode usar os df -t
sistemas Linux e df -T
BSD.
Do homem df :
-t, --type = TYPE
lista de limites para sistemas de arquivos do tipo TYPE
if df -t nfs | grep -q /path/to/folder$; then
# it is an NFS
fi
-t
opção tem um significado diferente no POSIX / SUS. Portanto, o uso desta opção pode fornecer resultados inconsistentes em diferentes versões na ferramenta / UNIX.
Eu usaria pessoalmente mountpoint
(muito portátil no Linux!):
NAME
mountpoint - see if a directory is a mountpoint
SYNOPSIS
mountpoint [-d|-q] directory
ou showmount
que é praticamente necessário instalar em qualquer sistema que realmente monte NFS
compartilhamentos (parte do nfs-common
pacote):
NAME
showmount - show mount information for an NFS server
SYNOPSIS
showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]
Outra opção seria algo como:
$ mount -l -t nfs | grep 'my mount point'
mountpoint
utilitário não informa se o ponto de montagem é remoto. Além disso, os sistemas de arquivos remotos não se limitam aos sistemas de arquivos NFS. Finalmente, mountpoint
não é padrão (não está nesta lista ).
mountpoint
é padrão neste caso.
find . -type d -name nfs -exec mountpoint {} \; | grep not
irá verificar todas as pastas nomeadas 'nfs' se estiverem montadas
nfs
.