Geben Sie den Mount-Punkt eines Pfades
Frage
Die folgende, sehr nicht-robuster Shell-Code wird den Mount-Punkt $path
geben:
(for i in $(df|cut -c 63-99); do case $path in $i*) echo $i;; esac; done) | tail -n 1
Gibt es einen besseren Weg, dies in der Schale zu tun?
Postscript
Dieses Skript ist wirklich schrecklich, hat aber die erlösende Qualität, dass es auf meinem System funktioniert. Beachten Sie, dass mehrere Einhängepunkte Präfixe von $path
sein kann.
Beispiele Auf einem Linux-System:
cas@txtproof:~$ path=/sys/block/hda1 cas@txtproof:~$ for i in $(df -a|cut -c 57-99); do case $path in $i*) echo $i;; esac; done| tail -1 /sys
Auf einem Mac OSX System
cas local$ path=/dev/fd/0 cas local$ for i in $(df -a|cut -c 63-99); do case $path in $i*) echo $i;; esac; done| tail -1 /dev
Beachten Sie die Notwendigkeit Senkung der Parameter zu variieren, weil der Ausgang unterscheidet sich die Art und Weise df; awk löst mit diesem, aber auch awk ist nicht tragbar, wird der Bereich des Ergebnisses gegebener Formatierung verschiedene Implementierungen von df Rückkehr.
Antwort Es sieht aus wie munging tabellarische Ausgabe der einzige Weg, in der Schale, aber
df -P "$path" | tail -1 | awk '{ print $NF}'
basierend auf ghostdog74 Antwort, ist eine große Verbesserung auf, was ich hatte. Beachten Sie zwei neue Themen: Zum einen df $path
dass $path
Namen eine vorhandene Datei besteht darauf, das Skript, das ich oben kümmert sich nicht hatte; zweitens gibt es keine Sorgen über Symlinks dereferencing. Das funktioniert nicht, wenn Sie Punkte montieren mit Leerzeichen in ihnen, das auftritt, wenn ein Wechselmedium mit Leerzeichen in ihrem Volumen Namen hat.
Es ist nicht schwierig, Python-Code zu schreiben, den Job richtig zu tun.
Lösung
df
führt den Pfad als Parameter, so etwas wie dies sollte ziemlich robust sein;
df "$path" | tail -1 | awk '{ print $6 }'
Andere Tipps
In der Theorie stat
wird Ihnen sagen, das Gerät die Datei auf, und es sollte auf einen Mount-Punkt eine Möglichkeit der Zuordnung des Gerätes sein.
Zum Beispiel auf Linux, sollte diese Arbeit:
stat -c '%m' $path
schon immer ein Fan von Formatierungsoptionen eines Programms verwenden, da es robuster sein kann als Ausgangs manipulieren (zB wenn der Mount-Punkt hat Leerzeichen). GNU df
ermöglicht die folgende:
df --output=target "$path" | tail -1
Leider gibt es keine Möglichkeit, die ich sehen kann den Druck eines Headers zu verhindern, so dass der Schwanz noch erforderlich ist.
ich weiß nicht, was Ihre gewünschte Ausgabe ist daher dies eine Vermutung ist,
#!/bin/bash
path=/home
df | awk -v path="$path" 'NR>1 && $NF~path{
print $NF
}'
mit -c Schnitt zu verwenden ist nicht wirklich zuverlässig, da die Ausgabe von df wird anders sein, etwa ein 5% bis 10% ändern kann und Sie werden einige Zeichen verpassen. Da der Mount-Punkt immer auf der Rückseite, können Sie Felder und Feldtrennzeichen verwenden. In dem obigen ist $ NF die letzte Spalte, die der Mount-Punkt ist.
würde ich den Quellcode zu df und finden Sie heraus, was es tut außer Aufruf stat
wie Douglas Leeder vermuten lässt.
Line-by-Line der df
Ausgabe Parsen werden Probleme wie die Linien verursachen oft aussehen
/dev/mapper/VOLGROUP00-logical--volume
1234567 1000000 200000 90% /path/to/mountpoint
Mit der zusätzlichen Komplexität als auch diese Art von Linien Parsen wahrscheinlich stat
Aufruf und der Suche nach dem Mount-Punkt ist weniger komplex.
mount | grep "^$path" | awk '{print $3}'
ich das verpasst, wenn ich über vor Fragen sah: Python: Get Mount-Punkt auf Windows oder Linux , die besagt, dass os.path.ismount(path)
wenn Pfad sagt ein Mount-Punkt.
Meine Präferenz ist für eine Shell-Lösung, aber das sieht ziemlich einfach.
Ich benutze diese:
df -h $path | cut -f 1 -d " " | tail -1
Linux hat das, was Problem mit Leerzeichen vermeiden:
lsblk -no MOUNTPOINT ${device}
Nicht sicher BSD Land.
f () { echo $6; }; f $(df -P "$path" | tail -n 1)
Wenn Sie nur verwenden möchten df und awk das Dateisystem-Gerät / Remote-Freigabe oder ein Mount-Punkt zu finden und sie sind Räume, die Sie durch die Definition der Feldtrenn von awk betrügen kann ein regulärer Ausdruck zu sein, die das Format der numerischen Spiele Größen verwendet Gesamtgröße, belegter Speicherplatz verfügbar Platz- und Kapazitäts Prozentsatz angezeigt werden soll. Durch die Definition dieser Spalten als Feldtrennzeichen sind Sie dann nach links mit $1
, die die Dateisystem-Gerät / Remote-Freigabe und $NF
, die den Ladepfad.
Nehmen Sie dies zum Beispiel:
[root@testsystem ~] df -P
Filesystem 1024-blocks Used Available Capacity Mounted on
192.168.0.200:/NFS WITH SPACES 11695881728 11186577920 509303808 96% /mnt/MOUNT WITH SPACES
Wenn Sie dies mit dem quick and dirty awk '{print $1}'
zu analysieren versuchen oder awk '{print $NF}'
Sie nur einen Teil des Dateisystems / Remote-Freigabe-Pfad und montieren Weg bekommen und das ist nicht gut. Jetzt macht awk verwenden, um die vier numerischen Datenspalten als Feldtrennzeichen.
[root@testsystem ~] df -P "/mnt/MOUNT WITH SPACES/path/to/file/filename.txt" | \
awk 'BEGIN {FS="[ ]*[0-9]+%?[ ]+"}; NR==2 {print $1}'
192.168.0.200:/NFS WITH SPACES
[root@testsystem ~] df -P "/mnt/MOUNT WITH SPACES/path/to/file/filename.txt" | \
awk 'BEGIN {FS="[ ]*[0-9]+%?[ ]+"}; NR==2 {print $NF}'
/mnt/MOUNT WITH SPACES
Genießen Sie: -)
Edit:. Diese Befehle basieren auf RHEL / CentOS / Fedora sollte aber fast jede Distribution arbeiten