In * nix, come determinare su quale filesystem si trova un determinato file?


12

In un ambiente unix generico e moderno (diciamo, GNU / Linux, GNU / Solaris o Mac OS X), c'è un buon modo per determinare su quale mountpoint e tipo di file system si trova un particolare percorso di file assoluto?

Suppongo che potrei eseguire il mountcomando e analizzare manualmente l'output di quello e confrontarlo con le stringhe con il mio percorso di file, ma prima di farlo mi chiedo se c'è un modo più elegante.

Sto sviluppando uno script BASH che utilizza attributi estesi e voglio farlo Fare la cosa giusta (nella misura in cui è possibile) per una varietà di filesystem e ambienti host.

Risposte:


19

Il comando df(1)accetta uno o più argomenti e restituirà il mountpoint e il dispositivo su cui esiste quel file o directory, nonché le informazioni sull'utilizzo. È quindi possibile utilizzare il percorso o il dispositivo per cercare il tipo di file system nell'output di mount -vo simili.

Sfortunatamente, il formato di output di entrambi dfe mountdipende dal sistema; non esiste uno standard apparente, almeno come posso vedere tra Solaris, NetBSD e Mac OS X.


1
df -Pdovrebbe produrre un output standardizzato su qualsiasi sistema conforme a POSIX. Alcuni sistemi più sciocchi potrebbero richiedere l'impostazione di una variabile d'ambiente magica, come POSIXLY_CORRECT.
Dan Molding,

Esempio df /path-to-the-directoryti darà la partizione contenente quella directory
Hasanuzzaman Sattar il

7

Puoi usare stat . Il comando stat --printf '% d' nomefile.txt restituirà il numero del dispositivo come esadecimale / decimale.


Quindi, come trovare la base dei nomi dei dispositivi su questo?
margherita,

Devi andare attraverso tutti i file del dispositivo in / dev / e cercarne uno con lo stesso numero minore di stat riportato.
Wiesław Herr,

stat --printf "%d"ti dice il numero minore di un dispositivo, ma c'è ancora molto lavoro da fare per ottenere il nome del dispositivo e il suo file system montato.
Craig McQueen,

2
Forse è un'aggiunta recente ma stat --format '%m' $fileti darà il punto di montaggio e stat --file-system --format '%T' $mountfornirà il nome del tipo di file system.
roaima,

1
@TomHale: non ricordare, a dire il vero. Ma ricordo che non ha funzionato. Devo ammettere che avrei dovuto dichiarare la distribuzione, la versione del kernel ecc. Ma affermando che funziona, potrebbe anche significare che nel frattempo è stato risolto. Se il risultato netto è che funziona, fantastico :)
0xC0000022L


2

Hm. Per il punto di montaggio, puoi salire la gerarchia fino a quando lo st_dev cambia (quindi hai appena attraversato un limite di montaggio); c'è GNU statper gli script bash; tuttavia, non so come sia possibile indovinare il tipo di filesystem senza analisi /proc/mountso per tentativi ed errori (ovvero gestire gli errori dopo aver impostato gli attributi estesi)


2

Un problema con l'utilizzo dfè che se il nome del dispositivo nell'output è lungo, la riga verrà spostata, quindi non puoi semplicemente prendere l'ultima riga. Rimuovi invece la prima riga, quindi prendi la nuova prima riga e quindi stampa il primo campo:

#!/usr/bin/env bash

path=$1
curdir=$(pwd)
cd $path
df . | tail -n +2 | head -1 | awk '{print $1}'
cd $curdir

3
Evita questo gotcha usando 'df -P' per ottenere output in formato POSIX e senza interruzioni di riga.
MikeyB,

2

Sembra che ci sia un problema con df e btrfs su Linux. Quando chiedi a df di individuare il punto di montaggio per un volume btrfs montato, farà la cosa giusta. In questo caso, joe è una sottodirectory di / m / whale / backup.

# df /srv/backup/joe
Filesystem      1K-blocks      Used  Available Use% Mounted on
/dev/md126     2930135488 307676684 2619663252  11% /m/whale/backup

Ma se la directory a cui si fa riferimento è un sotto-volume, non ti dirà più il punto di montaggio.

# df /srv/backup/joe/code
Filesystem      1K-blocks      Used  Available Use% Mounted on
-              2930135488 307676684 2619663252  11% /a/whale/backup/joe/code

Il / a / whale / backup è l'unico punto di mount secondo il kernel.

# mount | grep whale
/dev/md126 on /a/whale/backup type btrfs (rw,relatime,space_cache)

FWIW, stat fa la stessa cosa:

# stat --printf '%m\n' /srv/backup/joe/code
/a/whale/backup/joe/code

1

Da /programming/2167558/give-the-mount-point-of-a-path :

 df -P $path  | tail -1 | awk '{ print $NF}'

funziona ovunque ho provato, sia per * BSD e sysV, sia per stravaganti directory montate automaticamente. Sarei felice di sentire un caso in cui fallisce.


1
Il codice suggerito df -P $ percorso | coda -1 | awk "{print $ NF}" non riesce su tutte le versioni di Solaris che ho provato (2.5.1, 8, 9 e 10) perché "df" di Solaris non supporta l'opzione "-P".
Peter John Acklam,

@Peter: sono meno felice di quanto pensassi. Ma è interessante sapere che il problema non è banale. Penso che la cosa giusta sia scrivere un comando in un linguaggio di scripting la cui libreria ha risolto correttamente il problema, ad esempio Python ha la funzione os.path.splitunc () che fornisce il punto di montaggio e che presumo funzioni su Solaris.
Charles Stewart,

@CharlesStewart: Purtroppo, in Python non esiste una tale funzione per quanto ne sappia. os.path.splitunc()funziona solo per percorsi UNC ed è disponibile solo su Windows .
Aleksi Torhamo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.