Jak mogę określić typ fs mojego bieżącego katalogu roboczego?

19

Potrzebuję niezależnego od platformy i lekkiego sposobu wykrywania typu montażu mojego CWD. W szczególności muszę ustalić, czy mój plik CWD jest podłączony do SSHFS, NFS, CIFS, SMB, czy do lokalnego magazynu bloków.

Muszę to zrobić na Mac OSX 10.6, 10.7 i RHEL5 (przynajmniej).

Istnieje możliwość użycia df, ale df zachowuje się zupełnie inaczej na tych dwóch platformach. Dodatkowo musiałbym sflashować dane wyjściowe za pomocą awk, który choć wykonalny jest ... delikatny.

Informacje te muszą być dostępne na pewnym poziomie. Czy istnieje narzędzie, którego nie jestem świadomy, i które może dostarczyć mi te informacje?

Chris R.
źródło

Odpowiedzi:

17

Typ systemu plików nie jest czymś, co można łatwo uzyskać w sposób niezależny od systemu operacyjnego. Nazwy typów systemów plików są zależne od systemu operacyjnego, więc nie było żadnej zachęty do ustanowienia standardowej metody.

W niewbudowanych systemach Linux stat -f -c %T .pokazuje typ systemu plików bieżącego katalogu. statPolecenie OSX nie ma czegoś takiego.

Ponieważ wszystko, co chcesz wiedzieć, to czy typ systemu plików znajduje się na skończonej liście, w systemie Linux możesz ograniczyć zarówno zestaw ścieżek do drukowania informacji, jak i zestaw typów systemów plików. Pojawi się błąd („df: nie przetworzono systemów plików”), jeśli typ systemu plików bieżącego katalogu nie znajduje się na liście.

if df -t sshfs -t nfs -t cifs . >/dev/null 2>/dev/null; then …

Ta sama składnia może, ale nie musi działać w OSX; jeśli nie, spróbuj df -T sshfs,nfs,cifs ..

Gilles „SO- przestań być zły”
źródło
Właśnie tego potrzebowałem. Gilles, jesteś świetny!
ARX,
7

Możesz używać GNU stat w systemie Linux:

stat --file-system --format=%T /tmp/subdir/whatever
tmpfs
Eloff
źródło
Jest to świetne, ponieważ działa w podkatalogach. Dzięki!
Avindra Goolcharan
4

W Linuksie istnieje findmnt od wersji util-linux 2.18.

findmnt -n -o FSTYPE -T /home
nfs4
rudimeier
źródło
Nie działa dla / home / subdir, więc nie pomogłoby OP.
Eloff
Dla mnie działa również dla podkatalogów, używając findmount z util-linux 2.23.
rudimeier
3

Nie testowałem tego, ale df -Ppowinien zachowywać się tak samo na większości platform.

Działa to w systemie Linux.

$ mount | grep "^$(df -Pk . | head -n 2 | tail -n 1 | cut -f 1 -d ' ') " | cut -f 5 -d ' '

Lub rozbicie go na funkcje wielokrotnego użytku:

# get_mount <directory>
get_mount() {
    df -Pk "$1" | head -n 2 | tail -n 1 | cut -f 1 -d ' '
}

# get_fs <mountpoint>
get_fs() {
    mount | grep "^$1 " | cut -f 5 -d ' '
}

I wywoływanie funkcji:

get_fs $(get_mount .)

Można go przepisać, aby był nieco szybszy przy użyciu sedlub awk, ale ten sposób jest prawdopodobnie łatwiejszy do odczytania.

Jeśli to nie zadziała, możesz spróbować czegoś podobnego, ale używając /etc/mtabraczej niż wyjścia mount.

Mikel
źródło
PW df -Pjest dla POSIX, więc powinien zachowywać się w ten sam sposób. Jednak przejście ze ścieżki systemu plików do punktu podłączenia jest bardziej skomplikowane.
Gilles 'SO - przestań być zły'
1
Twoje rozwiązanie nie wydaje się bezpieczne, jeśli katalog jest podłączony z pętlą -o. Przynajmniej w moim systemie df pokazuje używane urządzenie pętli, ale mount pokazuje używany plik obrazu. Myślę, że może być jeszcze więcej przypadków, w których df nie pokazuje tego samego urządzenia, co mount. Zwróć uwagę na ten cytat ze strony podręcznika monta „Tryb wyświetlania jest utrzymywany tylko dla kompatybilności wstecznej. Aby uzyskać bardziej niezawodne i definiowalne dane wyjściowe, użyj findmnt (8), szczególnie w swoich skryptach.”
rudimeier