Gibt es in einer allgemeinen, modernen Unix-Umgebung (z. B. GNU / Linux, GNU / Solaris oder Mac OS X) eine gute Möglichkeit, um festzustellen, auf welchem Mountpunkt und Dateisystemtyp sich ein bestimmter absoluter Dateipfad befindet?
Ich nehme an, ich könnte den mount
Befehl ausführen und die Ausgabe manuell analysieren und mit meinem Dateipfad vergleichen, aber bevor ich das tue, frage ich mich, ob es einen eleganteren Weg gibt.
Ich entwickle ein BASH-Skript, das erweiterte Attribute verwendet, und möchte, dass es für eine Vielzahl von Dateisystemen und Hostumgebungen das Richtige tut (soweit dies möglich ist).
quelle
df -P
sollte auf jedem POSIX-kompatiblen System eine standardisierte Ausgabe erzeugen. Bei einigen gooferen Systemen muss möglicherweise auch eine magische Umgebungsvariable wie POSIXLY_CORRECT festgelegt werden.df /path-to-the-directory
gibt Ihnen die enthaltende Partition dieses VerzeichnissesSie könnten stat verwenden . Der Befehl stat --printf '% d' filename.txt gibt die Gerätenummer als Hex / Dezimal zurück.
quelle
stat --printf "%d"
gibt zwar die untergeordnete Nummer eines Geräts an, es muss jedoch noch mehr Arbeit geleistet werden, um den Gerätenamen und das angehängte Dateisystem abzurufen.stat --format '%m' $file
die Ihnen jedoch den Mount-Punkt undstat --file-system --format '%T' $mount
den Namen des Dateisystemtyps liefert.Nur für eine bestimmte Datei ist es so einfach wie
quelle
Hm. Für den Mount-Punkt können Sie die Hierarchie nach oben gehen, bis sich st_dev ändert (dann haben Sie gerade eine Mount-Grenze überschritten). Es gibt GNU
stat
für Bash-Skripte; Ich weiß jedoch nicht, wie man den Dateisystemtyp erraten kann, ohne ihn zu analysieren/proc/mounts
oder durch Ausprobieren (dh Fehler behandeln, nachdem erweiterte Attribute festgelegt wurden).quelle
Ein Gotcha bei der Verwendung
df
ist , dass , wenn der Gerätename in der Ausgabe lange ist es die Zeile umgebrochen wird , so dass Sie nicht nur die letzte Zeile greifen. Entfernen Sie stattdessen die erste Zeile, greifen Sie die neue erste Zeile und drucken Sie das erste Feld aus:quelle
Es scheint einen Haken bei df und btrfs unter Linux zu geben. Wenn Sie df auffordern, den Einhängepunkt für ein eingehängtes btrfs-Volume zu suchen, wird das Richtige getan. In diesem Fall ist Joe ein Unterverzeichnis von / m / whale / backup.
Wenn das Verzeichnis, auf das verwiesen wird, ein Sub-Volume ist, wird der Mount-Punkt nicht mehr angezeigt.
Das / a / whale / backup ist laut Kernel der einzige Einhängepunkt.
FWIW, stat macht dasselbe:
quelle
Unter /programming/2167558/give-the-mount-point-of-a-path :
Funktioniert überall, wo ich getestet habe, sowohl für * BSDs als auch für sysVs und für verrückte automounted-Verzeichnisse. Es würde mich sehr freuen, von einem Fall zu hören, in dem dies fehlschlägt.
quelle
os.path.splitunc()
Funktioniert nur für UNC-Pfade und ist nur unter Windows verfügbar .