informacje o montowaniu dla bieżącego katalogu

20

Mogę zrobić, df .aby uzyskać niektóre informacje na temat montowania, w którym znajduje się bieżący katalog, i mogę uzyskać wszystkie potrzebne informacje mount, ale uzyskać wiele informacji (informacje na temat innych montowań). Mogę to zepsuć, ale zastanawiam się, czy jest lepszy sposób.

Czy istnieje mountinfotakie polecenie , które mountinfo .daje informacje, które chcę (na przykład df ., ale z informacjami, które mountdają).


Używam Debian Gnu + Linux.

ctrl-alt-delor
źródło
1
Wierzę, że statmożna również użyć polecenia. Nie jestem jednak pewien, czy %mopcja podająca punkt montowania jest obsługiwana w twojej wersji systemu. Sprawdziłem swój system i wydawało się, że nie zwraca punktu montowania.
Ramesh
1
@ Ramesh, Tak stat "--printf=%m\n" .pobiera punkt podłączenia systemu plików, w którym znajduje się bieżący katalog. Pozwala to uprościć niektóre odpowiedzi. Dzięki.
ctrl-alt-delor

Odpowiedzi:

18

Myślę, że chcesz czegoś takiego:

findmnt -T .

Podczas korzystania z opcji

-T, - ścieżka docelowa
jeśli ścieżka nie jest plikiem lub katalogiem punktu montowania, findmntsprawdza elementy ścieżki w odwrotnej kolejności, aby uzyskać punkt montowania. Za pomocą można wydrukować tylko niektóre pola -o, --output [list].
Zobacz findmnt --helplistę dostępnych pól.


Alternatywnie możesz uruchomić:

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

Problem, na który napotykasz, polega na tym, że wszystkie ścieżki są względne w stosunku do czegoś, więc musisz po prostu przejść się po drzewie. Każdego razu.

findmntjest członkiem pakietu util-linux i działa już od kilku lat. Do tej pory, bez względu na dystrybucję, powinien on być już zainstalowany na komputerze z systemem Linux, jeśli masz również to mountnarzędzie.

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

findmntwypisze informacje o wszystkich montowaniach bez argumentu punktu podłączenia, i tylko dla argumentu z jednym. Jest -Dto opcja emulacjidf . Bez -Djego wyjścia jest podobny do mount's - ale o wiele bardziej konfigurowalny. Spróbuj findmnt --helpi przekonaj się sam.

Trzymam go w podpowłoce, aby bieżący katalog bieżącej powłoki się nie zmienił.

Więc:

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

WYNIK

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

Jeśli nie masz -Ddostępnej opcji (nie w starszych wersjach util-linux) , nigdy nie musisz się obawiać - w każdym razie jest to coś więcej niż wygodny przełącznik. Zwróć uwagę na nagłówki kolumn generowane dla każdego połączenia - możesz włączyć lub wyłączyć te dla każdego wywołania za pomocą -oprzełącznika utput. Mogę uzyskać takie same dane wyjściowe, -Djak:

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

WYNIK

SOURCE FSTYPE  SIZE  USED AVAIL USE% TARGET
tmpfs  tmpfs  11.8G  1.1G 10.6G  10% /tmp
mikeserv
źródło
Podoba mi się, poza tym -D, że nie mam tej opcji. (Jestem na Debianie7, util-linux 2.20.1-5.3)
ctrl-alt-delor
Za kilka dni will dam ci trochę czasu, by sprawdzić, czy ktoś ma bardziej idealną odpowiedź. Chociaż jest to prawie idealne (gdyby działało jak df: nie potrzebowało pętli, byłoby idealnie).
ctrl-alt-delor
@richard - to dobry pomysł - nie podoba mi się, gdy odpowiedzi są przyjmowane zbyt wcześnie. jeśli chodzi o pętlę i df- jestem gotów się założyć, że ma pętlę, po prostu nie musisz jej tego mówić.
mikeserv
1
Dzięki @ramesh możemy również zrobićfindmnt $(stat "--printf=%m\n" .)
ctrl-alt-delor
2
Moja wersja findmntma -Topcję, która może ominąć cd ..pętlę. Może być przydatny dla kogoś innego.
azot
1

Linux / Unix to zestaw narzędzi z małymi narzędziami, które po połączeniu dają wyniki, których szukasz.

Zwykle nie mają użyteczności na każdą okazję. Zamiast tego masz wiele małych przydatnych narzędzi, które są połączone z potokami itp. Zaletą tego jest to, że możesz napisać własne narzędzie dość łatwo, jeśli żadne nie jest dostępne.

Na przykład, aby uzyskać potrzebne informacje, możesz użyć:

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

Jeśli chcesz ponownie użyć powyższego z różnymi katalogami, utwórz skrypt:

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

Zapisz jako mountinfoi ustaw, aby był wykonywalny ( chmod +x mountinfo). Następnie możesz użyć go jako:

mountinfo .

Jeśli potrzebujesz systemu, który ma narzędzie do wszystkiego, z których żaden nie współpracuje ze sobą, pewien Pan Gates może ci pomóc ;-)

garethTheRed
źródło
--outputistnieje tylko w najnowszych wersjach jądra GNU (≥ 8,22).
Gilles 'SO - przestań być zły'
To jest właściwie to, co robiłem, po prostu mountbez żadnych opcji wydaje się trochę po namyśle: dzięki opcjom tworzącym punkty montowania, bez ich listy, liczyłem na lepsze narzędzie listy. Jak widzimy @mikeserv pokazał nam findmnt.
ctrl-alt-delor
1

Może być nieco niechlujny, jeśli punkty montowania zawierają spacje, ale powinno to działać, z wyjątkiem przypadków, w których punkty montowania zawierają nowe linie:

#!/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 -Pwypisuje jedną linię dla systemu plików; bez tej opcji dfmoże wyświetlać dwie linie, jeśli punkt montowania jest długi. Nazwa punktu podłączenia zaczyna się w tej samej kolumnie, co etykieta „Zamontowano” w wierszu nagłówka.

Po otrzymaniu punktu montowania, szukamy go w wynikach mount.

Mark Plotnick
źródło
1

Nie znam polecenia, ale możesz utworzyć funkcję. Możesz dodać poniżej do swojego.bashrc :

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

Wykonuje to mountpolecenie i przekazuje dane wyjściowe do grep. grepbędzie szukał danych wyjściowychdf -P "$1" | tail -n 1 | awk '{print $1}' i rozbić je:

  • df -P "$1" będzie działać df się na argumencie przekazanym do funkcji,
  • tail -n 1 wyświetli tylko drugi wiersz, ten zawierający partition informacje.
  • awk '{print $1}' wypisze pierwszą część tego wiersza, na przykład numer dysku / partycji /dev/sda5 . Właśnie tego grepbędzie szukać w poleceniu mount i wypisania go.

Źródło .bashrcpliku, aby zastosować zmiany, lub wyloguj się i zaloguj ponownie.

Teraz, jeśli uruchomisz mountinfo ., otrzymasz pożądaną wydajność.

Alaa Ali
źródło
To właściwie to, co robiłem (ale bez tej funkcji nie robię tego wystarczająco dużo, kiedy to robię w innych systemach, np. Odpowiedzi na tej stronie.), Po prostu mountbez żadnych opcji wydaje się trochę przemyślenie: dzięki opcjom tworzącym punkty montowania, bez ich listy, liczyłem na lepsze narzędzie listy. Jak widzimy @mikeserv pokazał nam findmnt.
ctrl-alt-delor
0

Jeśli używasz nie do końca starożytnej wersji GNU coreutils df, to echo $(df . --output=target | tail -n 1)działa. Podobnie z stat -c '%m' ., choć zauważam, że https://linux.die.net/man/1/stat brakuje dokumentacji%m opcji formatu.

Robienie tego przenośnie jest męczące: żadne z powyższych nie będzie działać z BSD ani Cygwin wersjami stat lub df. Gdyby nie możliwość spacji na ścieżkach punktów montowania, df -P . | tail -1 | awk '{ print $NF}'byłoby dobrze, ale często dyski flash USB mają spacje w nazwie woluminu, które prawdopodobnie pojawią się na ścieżce montowania i to zepsują. Aby zapewnić przenośność, Perl można zainstalować praktycznie wszędzie, a CPAN ma moduł Sys :: Filesystem :: MountPoint który zapewnia pożądaną funkcjonalność.

Charles Stewart
źródło
Czy możesz nam powiedzieć, co echo $()dodaje się do polecenia?
ctrl-alt-delor