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 ++.


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:



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

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;
}

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)


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.