it-swarm.com.de

Überprüfen Sie, ob der Ordner ein bereitgestelltes Remote-Dateisystem ist

Was ist der beste Weg (zuverlässig, portabel usw.), um zu überprüfen, ob sich ein bestimmter Ordner in einem Shell-Skript auf einem gemounteten Remote-Dateisystem (NFS) befindet?

Ich suche nach einem Befehl, der wie folgt aussehen würde:

chk-remote-mountpoint /my/path/to/folder 
44
Totor

Wie Stephane sagt "es gibt keine universelle Unix-Antwort darauf".

Die beste Lösung, die ich für meine Frage gefunden habe:

df -P -T /my/path/to/folder | tail -n +2 | awk '{print $2}'

gibt den Dateisystemtyp zurück, zum Beispiel: nfs oder ext3.

Das -T option ist nicht standard , daher funktioniert es möglicherweise nicht auf anderen Unix/Linux-Systemen ...

Laut Gilles 'Kommentar unten: "Dies funktioniert unter jedem nicht eingebetteten Linux, aber nicht unter BusyBox, * BSD usw."

34
Totor

Sie könnten GNU stat verwenden.

%m, Um den Mountpoint herauszufinden.

$ stat --format=%m /usr/src/linux
/usr/src

%T (Im Dateisystemmodus), um den Namen des Dateisystems herauszufinden.

$ stat --file-system --format=%T /usr/src/linux
reiserfs

Sie wissen also, dass /usr/src/linux Auf meinem System in einem Dateisystem gespeichert ist, das auf /usr/src Bereitgestellt ist und den Dateisystemtyp reiserfs hat.

Weitere Informationen finden Sie unter man stat. Es ist ein sehr vielseitiger Befehl, der fast immer nützlich ist, wenn Sie Informationen zu Dateien benötigen und nicht auf grep | awk Zurückgreifen möchten.

13
frostschutz

mount -l und verwenden Sie grep, sed oder awk, um die Zeile zu finden, die auf das betreffende Verzeichnis verweist.

5
jayhendren

Das "-l" bis df (1) schlägt mit einem Fehler auf nicht lokalen Dateisystemen fehl. Sie können dieses Verhalten verwenden, um festzustellen, ob das Dateisystem remote ist:

df -l /path 2> /dev/null | grep -q "File"
rc=$?
if [ "$rc" = "0" ]
then
   echo "local mount, do stuff"
fi

Die -l Option ist nicht Standard .

2
rsone1

Leider gibt es darauf keine universelle Unix-Antwort.

Eine Sache, die Sie für eine bestimmte Datei /a/b/c/d Tun können, ist, den Pfad hinaufzugehen:

  • /ABC/.
  • /ABC/..
  • /ABC/../..
  • ...

... und mache auf jeder Ebene eine stat(2), bis sich st_dev ändert. Dann wissen Sie, wo sich der Einhängepunkt befindet. Dann können Sie den kanonischen Pfad dieses Einhängepunkts in /etc/mtab Oder in der Ausgabe von mount nachschlagen, um den Dateisystemtyp herauszufinden. Dann wird es schwierig sein, herauszufinden, was entfernt ist und was nicht, insbesondere für Sicherungstypen. Zum Beispiel sind nfs, cifs, Fuse.sshfs, Fuse.davfs Offensichtlich, aber was ist zum Beispiel mit Fuse.gvfs-Fuse-daemon Oder Fuse.avfsd, die sowohl Netzwerk- als auch Nicht-Netzwerkdateien enthalten können?

2

df /path Sagt Ihnen, dass /path Ein Einhängepunkt ist, wenn angegeben wird, dass der Einhängepunkt nicht / Ist.

1
pgen

Tun:

df /me/path/to/folder

Wenn das erste Feld (das Dateisystem) das Format Host:/path hat, wissen Sie, dass es sich um NFS handelt

Damit:

df /my/path/to/folder | awk 'NR==1{next};$1~/:[/]/{print "yes";exit(0)};{print "No";exit(1)}'

Fügen Sie es nun in eine Bash-Datei mit dem Namen "ifchk-remote-mountpoint" ein.

Verwendungszweck:

if ifchk-remote-mountpoint  /my/path/to/folder >/dev/null; then
    ...do something...
fi

oder:

ISNFS=$(ifchk-remote-mountpoint  /my/path/to/folder)
1
Udi

Du kannst den ... benutzen df -t unter Linux und df -T auf BSD-Systemen.

Von man df :

-t, --type = TYPE

beschränken Sie die Auflistung auf Dateisysteme vom Typ TYPE

if df -t nfs | grep -q /path/to/folder$; then
  # it is an NFS
fi
0
codeforester