Wie kann man am besten überprüfen, ob zwei Verzeichnisse zum selben Dateisystem gehören?
Akzeptable Antworten: Bash, Python, C / C ++.
Wie kann man am besten überprüfen, ob zwei Verzeichnisse zum selben Dateisystem gehören?
Akzeptable Antworten: Bash, Python, C / C ++.
Antworten:
Dies kann durch Vergleichen der Gerätenummern erfolgen .
In einem Shell-Skript unter Linux kann dies mit stat erfolgen :
stat -c "%d" /path # returns the decimal device number
In Python :
os.lstat('/path...').st_dev
oder
os.stat('/path...').st_dev
Der Standardbefehl df
zeigt 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
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;
}
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)