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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top