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
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."
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 | awk
wardward.
mount -l
et utilisez grep
, sed
ou awk
pour trouver la ligne qui fait référence au répertoire en question.
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 .
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:
... 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?
df /path
vous dira que /path
est un point de montage s'il indique que le point de montage n'est pas /
.
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)
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