So prüfen Sie, ob zwei Verzeichnisse oder Dateien zum selben Dateisystem gehören


15

Wie kann man am besten überprüfen, ob zwei Verzeichnisse zum selben Dateisystem gehören?

Akzeptable Antworten: Bash, Python, C / C ++.


Wenn Sie Python / C ++ Antworten möchten, sind Sie auf der falschen Seite
Michael Mrozek

Guter Punkt - ich sollte schreiben "Python, C / C ++ sind akzeptabel".
Grzegorz Wierzowiecki

@MichaelMrozek Denken Sie daran, dass C-API-Fragen zum Thema gehören: meta.unix.stackexchange.com/questions/314/…
Grzegorz Wierzowiecki

Antworten:



3

Der Standardbefehl dfzeigt an, auf welchem ​​Dateisystem sich die angegebene (n) Datei (en) befinden.

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

Ich bin auf die gleiche Frage in einem Qt / C ++ - basierten Projekt gestoßen und habe diese einfache und portable Lösung gefunden:

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

Sehr spezifische Bibliothek, schwer und nicht Standard.
Sandburg

1

Die "stat" -Antwort ist am genauesten, aber sie wird falsch positiv, wenn sich zwei Dateisysteme auf demselben Gerät befinden. Hier ist die beste Linux-Shell-Methode, die ich bisher gefunden habe (dieses Beispiel ist für Bash).

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

(benötigt Coreutils 8.21 oder neuer)


Dies erfordert Coreutils 8.21 oder neuer. ( Verpflichten , dass hinzugefügt , um die Funktion) ( Release Notes , die die Funktion berichten)
Keith Russell
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.