informazioni di montaggio per la directory corrente


20

Posso fare df .per ottenere alcune delle informazioni sul mount in cui si trova la directory corrente e posso ottenere tutte le informazioni che desidero mount, ma ottenere molte informazioni (informazioni su altri mount). Riesco a digerirlo, ma mi chiedo se esiste un modo migliore.

C'è qualche comando in modo mountinfotale che mountinfo .dia le informazioni che voglio (come df ., ma con le informazioni che mountdanno.)


Sto usando Debian Gnu + Linux.


1
Credo che si statpossa usare anche il comando. Tuttavia, non sono sicuro che l' %mopzione che fornisce il punto di montaggio sia supportata nella tua versione del sistema. Ho controllato il mio sistema e sembrava non restituire il punto di montaggio.
Ramesh,

1
@Ramesh, Sì stat "--printf=%m\n" .ottiene il punto di montaggio del file system in cui si trova la directory corrente. Ciò ci consente di semplificare alcune delle risposte. Grazie.
ctrl-alt-delor

Risposte:


18

Penso che tu voglia qualcosa del genere:

findmnt -T .

Quando si utilizza l'opzione

-T, --target path
se il percorso non è un file o una directory mountpoint, findmntcontrolla gli elementi del percorso in ordine inverso per ottenere il mountpoint. È possibile stampare solo determinati campi tramite -o, --output [list].
Vedi findmnt --helpl'elenco dei campi disponibili.


In alternativa, puoi eseguire:

(until findmnt . ; do cd .. ; done)

Il problema in cui ti imbatti è che tutti i percorsi sono relativi a qualcosa o altro, quindi devi solo camminare sull'albero. Ogni volta.

findmntè un membro del pacchetto util-linux ed è stato per alcuni anni. Ormai, indipendentemente dalla tua distribuzione, dovrebbe già essere installato sulla tua macchina Linux se hai anche lo mountstrumento.

man mount | grep findmnt -B1 -m1
For  more robust and customizable output use
findmnt(8),  especially  in  your   scripts.

findmntstamperà tutte le informazioni dei mount senza un argomento mount-point, e solo quello per il suo argomento con uno. Il -Dè l'emularedf opzione. Senza il -Dsuo output è simile a quello di mount- ma molto più configurabile. Prova a findmnt --helpvedere di persona.

Lo inserisco in una subshell in modo che la directory corrente della shell corrente non cambi.

Così:

mkdir -p /tmp/1/2/3/4/5/6 && cd $_ 
(until findmnt . ; do cd .. ; done && findmnt -D .) && pwd

PRODUZIONE

TARGET SOURCE FSTYPE OPTIONS
/tmp   tmpfs  tmpfs  rw
SOURCE FSTYPE  SIZE   USED AVAIL USE% TARGET
tmpfs  tmpfs  11.8G 839.7M   11G   7% /tmp
/tmp/1/2/3/4/5/6

Se non hai l' -Dopzione a tua disposizione (non nelle versioni precedenti di util-linux), non devi mai temere: in ogni caso è poco più che un interruttore di convenienza. Notare le intestazioni di colonna che produce per ogni chiamata: è possibile includere o escludere quelle per ogni -ochiamata con l' interruttore utput. Posso ottenere lo stesso output che -Dpotrebbe fornire come:

 findmnt /tmp -o SOURCE,FSTYPE,SIZE,USED,AVAIL,USE%,TARGET

PRODUZIONE

SOURCE FSTYPE  SIZE  USED AVAIL USE% TARGET
tmpfs  tmpfs  11.8G  1.1G 10.6G  10% /tmp

Mi piace, tranne un po ' -D, non ho questa opzione. (Sono su Debian7, util-linux 2.20.1-5.3)
ctrl-alt-delor

Ti √ tra qualche giorno, lascerò del tempo per vedere se qualcuno ha una risposta più perfetta. Anche se questo è quasi perfetto (se funzionasse come df: non aveva bisogno del loop, sarebbe perfetto).
ctrl-alt-delor

@richard - è una buona idea - non mi piace quando le risposte vengono accettate troppo presto. per quanto riguarda il loop e df- sono disposto a scommettere che loop, non devi semplicemente dirlo per farlo.
Mikeserv,

1
Grazie a @ramesh possiamo anche farefindmnt $(stat "--printf=%m\n" .)
ctrl-alt-delor

2
La mia versione di findmntha -Tun'opzione che può bypassare il cd ..loop. Potrebbe essere utile a qualcun altro.
azoto

1

Il modo Linux / Unix è di avere una cassetta degli attrezzi di piccole utilità che, se combinati, ti danno i risultati che stai cercando.

Tendono a non avere un'utilità per ogni occasione. Invece hai molte piccole utilità utili che sono combinate con pipe ecc. Il vantaggio di questo è che puoi scrivere la tua utility abbastanza facilmente se nessuna è disponibile.

Ad esempio, per ottenere le informazioni che cerchi, puoi utilizzare:

mount | grep $(df  --output=source . | tail -1)

Se si desidera riutilizzare quanto sopra con directory diverse, creare uno script:

#!/bin/bash
mount | grep $(df  --output=source $1 | tail -1)

Salvalo come mountinfoe rendilo eseguibile ( chmod +x mountinfo). Puoi quindi usarlo come:

mountinfo .

Se vuoi un sistema che abbia un'utilità per tutto ciò che non interagisce tra loro, un certo Mr Gates potrebbe essere in grado di aiutarti ;-)


--outputesiste solo in versioni molto recenti di coreutils GNU (≥8,22).
Gilles 'SO- smetti di essere malvagio' l'

Questo è praticamente quello che ho fatto, è che mountsenza opzioni sembra un po 'ripensato: con le opzioni che crei punti di montaggio, senza che li elenchi, speravo in uno strumento di elenco migliore. Come vediamo @mikeserv ci ha mostrato findmnt.
ctrl-alt-delor

1

Può essere un po 'disordinato se i punti di montaggio contengono spazi vuoti, ma questo dovrebbe funzionare tranne nei casi in cui i punti di montaggio contengono nuove righe:

#!/bin/sh
mountpoint="$(df -P "$1" | awk '{
    if (NR==1)
        i=index($0,"Mounted on");
    else
        print substr($0,i);
    }')"
mount|grep " on ${mountpoint} type "

df -Pgenera una riga per il filesystem; senza tale opzione, dfpuò generare due righe se il punto di montaggio è lungo. Il nome del punto di montaggio inizia nella stessa colonna dell'etichetta "Montato su" nella riga di intestazione.

Dopo aver ottenuto il punto di montaggio, lo richiediamo nell'output di mount.


1

Non conosco un comando, ma potresti creare una funzione. Puoi aggiungere quanto segue al tuo .bashrc:

mountinfo () {
  mount | grep $(df -P "$1" | tail -n 1 | awk '{print $1}')
}

Questo esegue il mountcomando e passa l'output a grep. grepcercherà l'output di df -P "$1" | tail -n 1 | awk '{print $1}', e per scomporlo:

  • df -P "$1"verrà eseguito dfsull'argomento passato alla funzione,
  • tail -n 1produrrà solo la seconda riga, quella che contiene le partitioninformazioni.
  • awk '{print $1}'stamperà la prima parte di quella riga, ad esempio il numero del disco / della partizione /dev/sda5. Questo è ciò grepche cercherà nel comando mount e lo emetterà.

Sorgente il .bashrcfile per applicare le modifiche o disconnettersi e riconnettersi.

Ora, se corri mountinfo ., otterrai l'output desiderato.


Questo è praticamente quello che ho fatto (ma senza la funzione, non lo faccio abbastanza, quando lo faccio è su altri sistemi, ad esempio le risposte su questo sito.), È solo che mountsenza opzioni sembra un po 'di un ripensamento: con le opzioni che crei punti di montaggio, senza che li elenchi, speravo in uno strumento di elenco migliore. Come vediamo @mikeserv ci ha mostrato findmnt.
ctrl-alt-delor

0

Se stai usando una versione non completamente antica di GNU coreutils df, allora echo $(df . --output=target | tail -n 1)funziona. Allo stesso modo stat -c '%m' ., anche se noto che https://linux.die.net/man/1/stat manca di documentazione %msull'opzione di formato.

Fare questo in modo portabile è noioso: nessuno dei precedenti funzionerà con le versioni di stat o df di BSD o Cygwin. Se non fosse per la possibilità di spazi nei percorsi dei punti di montaggio, df -P . | tail -1 | awk '{ print $NF}'sarebbe buono, ma spesso le unità flash USB hanno spazi nel nome del volume, che probabilmente appariranno nel percorso di montaggio e lo romperanno. Per portabilità, Perl è installabile praticamente ovunque e CPAN ha il modulo Sys :: Filesystem :: MountPoint che fornisce le funzionalità desiderate.


Puoi dirci cosa echo $()aggiunge il comando?
ctrl-alt-delor
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.