Comment vérifier si deux répertoires ou fichiers appartiennent au même système de fichiers

15

Quelle est la meilleure façon de vérifier si deux répertoires appartiennent au même système de fichiers?

Réponses acceptables: bash, python, C / C ++.

Grzegorz Wierzowiecki
la source
Si vous voulez des réponses python / C ++, vous êtes sur le mauvais site
Michael Mrozek
Bon point - je devrais écrire "python, C / C ++ sont acceptables".
Grzegorz Wierzowiecki
@MichaelMrozek souvenez-vous que les questions sur l'API C sont sur le sujet: meta.unix.stackexchange.com/questions/314/…
Grzegorz Wierzowiecki

Réponses:

23

Cela peut être fait en comparant les numéros d'appareils .

Dans un script shell sous Linux, cela peut être fait avec stat :

stat -c "%d" /path  # returns the decimal device number 

En python :

os.lstat('/path...').st_dev

ou

os.stat('/path...').st_dev
Grzegorz Wierzowiecki
la source
3

La commande standard dfindique sur quel système de fichiers se trouve le ou les fichiers spécifiés.

if df -P -- "$1" "$2" | awk 'NR==2 {dev1=$1} NR==3 {exit($1!=dev1)}'; then
  echo "$1 and $2 are on the same filesystem"
else
  echo "$1 and $2 are on different filesystems"
fi
Gilles 'SO- arrête d'être méchant'
la source
3

Je viens de rencontrer la même question dans un projet basé sur Qt / C ++, et j'ai trouvé cette solution simple et portable:

#include <QFileInfo>
...
#include <sys/stat.h>
#include <sys/types.h>
...
bool SomeClass::isSameFileSystem(QString path1, QString path2)
{
        // - path1 and path2 are expected to be fully-qualified / absolute file
        //   names
        // - the files may or may not exist, however, the folders they belong
        //   to MUST exist for this to work (otherwise stat() returns ENOENT) 
        struct stat stat1, stat2;
        QFileInfo fi1(path1), fi2(path2),
        stat(fi1.absoluteDir().absolutePath().toUtf8().constData(), &stat1);
        stat(fi2.absoluteDir().absolutePath().toUtf8().constData(), &stat2);
        return stat1.st_dev == stat2.st_dev;
}
Biscuit
la source
Bibliothèque très spécifique, lourde et non standard.
Sandburg
1

La réponse "stat" est tersest, mais elle obtient des faux positifs lorsque deux systèmes de fichiers sont sur le même périphérique. Voici la meilleure méthode de shell Linux que j'ai trouvée jusqu'à présent (cet exemple concerne Bash).

if [ "$(df file1 --output=target | tail -n 1)" == \
     "$(df file2 --output=target | tail -n 1)" ]
    then echo "same"
fi

(nécessite coreutils 8.21 ou plus récent)

Keith Russell
la source
Cela nécessite Coreutils 8.21 ou plus récent. ( commit qui a ajouté la fonctionnalité) ( notes de version qui signalent la fonctionnalité)
Keith Russell