16 votes

Dans *nix, comment déterminer sur quel système de fichiers se trouve un fichier particulier ?

Dans un environnement Unix moderne et générique (par exemple, GNU/Linux, GNU/Solaris ou Mac OS X), existe-t-il un bon moyen de déterminer sur quel point de montage et quel type de système de fichiers se trouve un chemin de fichier absolu particulier ?

Je suppose que je podría exécuter le mount et d'analyser manuellement la sortie de cette commande pour la comparer avec le chemin d'accès à mon fichier, mais avant de faire cela, je me demande s'il n'y a pas un moyen plus élégant.

Je développe un BASH script qui utilise des attributs étendus, et je veux qu'il fasse la bonne chose (dans la mesure où c'est possible) pour une variété de systèmes de fichiers et d'environnements hôtes.

22voto

Morven Points 1011

La commande df(1) prend un ou plusieurs arguments et renvoie le point de montage et le périphérique sur lesquels ce fichier ou ce répertoire existe, ainsi que des informations sur son utilisation. Vous pouvez alors utiliser le chemin ou le périphérique pour rechercher le type de système de fichiers dans la sortie de mount -v ou similaire.

Malheureusement, le format de sortie des deux df y mount dépendent du système ; il n'y a pas de standard apparent, du moins à ce que je vois entre Solaris, NetBSD et Mac OS X.

1 votes

df -P devrait produire une sortie standardisée sur tout système compatible POSIX. Certains systèmes plus maladroits peuvent exiger qu'une variable d'environnement magique, telle que POSIXLY_CORRECT, soit également définie.

1 votes

Exemple df /path-to-the-directory vous donnera la partition contenant ce répertoire

10voto

jammus Points 1796

Vous pourriez utiliser stat . La commande stat --printf '%d' filename.txt renverra le numéro du périphérique en hexadécimal.

0 votes

Alors, comment trouver le nom de l'appareil à partir de cela ?

0 votes

Vous devez parcourir tous les fichiers de périphériques dans /dev/ et en rechercher un avec le même numéro mineur que celui signalé par stat.

1 votes

stat --printf "%d" vous indique le numéro mineur d'un périphérique, mais il y a plus de travail à faire pour obtenir le nom du périphérique et son système de fichiers monté.

5voto

Pour un fichier spécifique, c'est aussi simple que

df -T "${FILE}" | awk '{print $2}' | tail -n1

0 votes

Ne fonctionne pas avec btrfs !

2voto

Nip Points 881

Hm. Pour le point de montage, vous pouvez remonter la hiérarchie jusqu'à ce que le st_dev change (vous venez alors de franchir une limite de montage) ; il y a GNU stat pour bash scripts ; cependant, je ne sais pas comment vous pouvez deviner le type de système de fichiers sans analyser les données /proc/mounts ou par essai et erreur (par exemple, gérer les échecs après avoir défini des attributs étendus)

2voto

mage2k Points 479

Un problème avec l'utilisation de df est que si le nom du périphérique dans la sortie est long, la ligne va s'enrouler et vous ne pouvez pas simplement saisir la dernière ligne. Il faut plutôt enlever la première ligne, puis saisir la nouvelle première ligne et enfin imprimer le premier champ :

#!/usr/bin/env bash

path=$1
curdir=$(pwd)
cd $path
df . | tail -n +2 | head -1 | awk '{print $1}'
cd $curdir

3 votes

Évitez ce piège en utilisant 'df -P' pour obtenir une sortie au format POSIX et sans coupure de ligne.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X