web-dev-qa-db-fra.com

Vérifiez si le dossier est un système de fichiers distant monté

Quelle est la meilleure façon (fiable, portable, etc.) de vérifier si un dossier donné se trouve sur un système de fichiers distant (nfs) monté dans un script Shell?

Je recherche une commande qui ressemblerait à:

chk-remote-mountpoint /my/path/to/folder 
44
Totor

Comme Stéphane dit "il n'y a pas de réponse Unix universelle à cela".

La meilleure solution que j'ai trouvée à ma question:

df -P -T /my/path/to/folder | tail -n +2 | awk '{print $2}'

renverra le type de système de fichiers, par exemple: nfs ou ext3.

Le -T option n'est pas standard , donc cela peut ne pas fonctionner sur d'autres systèmes Unix/Linux ...

Selon Gilles 'commentaire ci-dessous: "Cela fonctionne sur n'importe quel Linux non embarqué, mais pas sur BusyBox, * BSD, etc."

34
Totor

Vous pouvez utiliser GNU stat.

%m pour connaître le point de montage.

$ stat --format=%m /usr/src/linux
/usr/src

%T (en mode système de fichiers) pour connaître le nom du système de fichiers.

$ stat --file-system --format=%T /usr/src/linux
reiserfs

Vous savez donc que /usr/src/linux, sur mon système, est stocké dans un système de fichiers monté sur /usr/src et a le type de système de fichiers reiserfs.

Voir également man stat pour référence ultérieure. C'est une commande très polyvalente, utile presque toujours lorsque vous avez besoin d'informations sur les fichiers et que vous ne souhaitez pas revenir à grep | awkwardward.

13
frostschutz

mount -l et utilisez grep, sed ou awk pour trouver la ligne qui fait référence au répertoire en question.

5
jayhendren

Le "-l" à df (1) échouera avec une erreur sur les systèmes de fichiers non locaux, vous pouvez donc utiliser ce comportement pour savoir si le système de fichiers est distant:

df -l /path 2> /dev/null | grep -q "File"
rc=$?
if [ "$rc" = "0" ]
then
   echo "local mount, do stuff"
fi

Cependant, le -l l'option est non standard .

2
rsone1

Malheureusement, il n'y a pas de réponse Unix universelle à cela.

Une chose que vous pouvez faire, pour un fichier donné /a/b/c/d Est de remonter le chemin:

  • /abc/.
  • /abc/..
  • /abc/../..
  • ...

... et faites une stat(2) à chaque niveau, jusqu'à ce que st_dev change. Vous saurez alors où se trouve le point de montage. Ensuite, vous pouvez rechercher le chemin canonique de ce point de montage dans /etc/mtab Ou dans la sortie de mount pour connaître le type de système de fichiers. Ensuite, découvrir ce qui est distant et ce qui ne va pas être difficile, en particulier pour ceux de type Fuse. Par exemple, nfs, cifs, Fuse.sshfs, Fuse.davfs Sont évidents, mais qu'en est-il par exemple Fuse.gvfs-Fuse-daemon Ou Fuse.avfsd qui peut avoir des fichiers réseau et non réseau?

2
Stéphane Chazelas

df /path vous dira que /path est un point de montage s'il indique que le point de montage n'est pas /.

1
pgen

Faire:

df /me/path/to/folder

Si le premier champ (le système de fichiers) est au format Host:/path, alors vous savez qu'il s'agit de NFS

Donc:

df /my/path/to/folder | awk 'NR==1{next};$1~/:[/]/{print "yes";exit(0)};{print "No";exit(1)}'

Maintenant, placez-le dans un fichier bash nommé "ifchk-remote-mountpoint".

Usage:

if ifchk-remote-mountpoint  /my/path/to/folder >/dev/null; then
    ...do something...
fi

ou:

ISNFS=$(ifchk-remote-mountpoint  /my/path/to/folder)
1
Udi

Vous pouvez utiliser le df -t sous Linux et df -T sur les systèmes BSD.

De man df :

-t, --type = TYPE

limiter la liste aux systèmes de fichiers de type TYPE

if df -t nfs | grep -q /path/to/folder$; then
  # it is an NFS
fi
0
codeforester