Czy w ogólnym, nowoczesnym środowisku unixowym (powiedzmy GNU / Linux, GNU / Solaris lub Mac OS X) istnieje dobry sposób, aby ustalić, który punkt montowania i typ systemu plików ma dana absolutna ścieżka do pliku?
Podejrzewam, że mógłbym wykonać mount
polecenie i ręcznie przeanalizować dane wyjściowe i porównać je ze ścieżką pliku, ale zanim to zrobię, zastanawiam się, czy istnieje bardziej elegancki sposób.
Zajmuję się tworzeniem skryptu BASH, który wykorzystuje rozszerzone atrybuty, i chcę, aby działał on właściwie (w niewielkim stopniu, w jakim jest to możliwe) dla różnych systemów plików i środowisk hosta.
źródło
df -P
powinien generować znormalizowane dane wyjściowe w dowolnym systemie zgodnym z POSIX. Niektóre systemy gooferów mogą również wymagać ustawienia magicznej zmiennej środowiskowej, takiej jak POSIXLY_CORRECT.df /path-to-the-directory
da Ci zawierającą partycję tego kataloguMożesz użyć statystyki . Polecenie stat --printf '% d' nazwa_pliku.txt zwróci numer urządzenia w postaci szesnastkowej / dziesiętnej.
źródło
stat --printf "%d"
wskazuje mniejszą liczbę urządzeń, ale jest jeszcze wiele do zrobienia, aby uzyskać nazwę urządzenia i zamontowany system plików.stat --format '%m' $file
poda punkt montowania istat --file-system --format '%T' $mount
poda nazwę typu systemu plików.W przypadku konkretnego pliku jest to tak proste, jak
źródło
Hm Dla punktu montowania możesz iść w górę hierarchii, aż zmieni się st_dev (wtedy właśnie przekroczyłeś granicę montowania); istnieje GNU
stat
dla skryptów bash; nie wiem jednak, jak odgadnąć typ systemu plików bez analizowania/proc/mounts
lub metodą prób i błędów (tj. obsługi błędów po ustawieniu atrybutów rozszerzonych)źródło
Jednym z problemów związanych z używaniem
df
jest to, że jeśli nazwa urządzenia na wyjściu jest długa, wiersz zostanie zawinięty, więc nie można po prostu pobrać ostatniej linii. Zamiast tego zdejmij pierwszą linię, a następnie chwyć nową pierwszą linię, a następnie wydrukuj pierwsze pole:źródło
Wydaje się, że w Linuksie istnieje pewien problem z df i btrfs. Gdy poprosisz df o zlokalizowanie punktu montowania zamontowanego woluminu btrfs, zrobi to dobrze. W tym przypadku Joe jest podkatalogiem / m / whale / backup.
Ale jeśli katalog, do którego następuje odwołanie, jest pod-woluminem, nie będzie już wskazywać punktu podłączenia.
/ A / whale / backup jest jedynym punktem montowania zgodnie z jądrem.
FWIW, stat robi to samo:
źródło
Od /programming/2167558/give-the-mount-point-of-a-path :
działa wszędzie, gdzie testowałem, zarówno dla * BSD i sysV, jak i dla zwariowanych automatycznych katalogów. Z przyjemnością usłyszę o przypadku, w którym się nie powiedzie.
źródło
os.path.splitunc()
działa tylko dla ścieżek UNC i jest dostępny tylko w systemie Windows .