Jak mogę sprawdzić, czy /my/dir
jest na tej samej partycji co /
?
Ma to na celu integrację ze skryptem. Mocowania do wiązania powinny być obsługiwane poprawnie. Rozwiązania zgodne z POSIX są mile widziane.
shell-script
mount
Totor
źródło
źródło
Odpowiedzi:
Możesz to sprawdzić za pomocą statystyki:
Wyświetla numer urządzenia i miejsce zamontowania katalogu.
źródło
stat
polecenie powłoki nie jest POSIX ...Następujące polecenie podaje unikalną nazwę punktu podłączenia zawierającego plik
$file
:Działa to na każdym systemie POSIX .
-P
Opcja nakłada przewidywalnego formatu; pierwsze pole drugiego wiersza to „nazwa systemu plików”. Tak więc, aby sprawdzić, czy dwa pliki znajdują się w tym samym punkcie montowania:Lub, aby zapisać kilka wywołań procesów:
Kilka systemów operacyjnych może mieć spacje w nazwach woluminów. W
df
tym przypadku nie ma całkowicie niezawodnego sposobu analizowania danych wyjściowych.Pod maską możesz zidentyfikować system plików zawierający plik po
st_dev
polu zwróconym przezstat
. Nie ma przenośnego sposobu na zrobienie tego ze skryptu powłoki. Niektóre systemy mająstat
narzędzie, ale jego składnia jest różna:stat
zgłaszast_dev
pole po wywołaniu jakostat -c %D -- "$file"
.stat
które są kompatybilne z coreutils GNU. Inni mająstat
bez%c
opcji; możesz użyć,stat -t -- "$file" | awk '{print $8}'
ale działa to tylko wtedy, gdy nazwa pliku nie zawiera spacji lubstat -t -- "$file" | awk 'END {print $(NF-8)}'
która kopiuje z dowolnymi nazwami plików, ale nie z przyszłymi dodatkami pól do danychstat
wyjściowych.stat
narzędzie, które wymagastat -f %d -- "$file"
.stat
narzędzia.Jeśli Perl jest dostępny, możesz użyć
i do porównania:
Należy pamiętać, że istnieją przypadki narożne, w których pożądany wynik nie jest jasny. Na przykład, z powiązań wierzchowców Linuksa, po
mount --bind /foo /bar
,/foo
i/bar
są uważane za tym samym systemie plików. Zawsze jest możliwe, że oba pliki znajdują się na tym samym urządzeniu, ale nigdy się nie dowiesz: na przykład, jeśli pliki znajdują się na dwóch różnych podłączeniach sieciowych, klient nie ma możliwości sprawdzenia, czy serwer eksportuje różne systemy plików.Jeśli pliki są katalogami i można do nich pisać, inną metodą jest utworzenie pliku tymczasowego i próba utworzenia twardego łącza. Ten raport podaje negatywny wynik w przypadku podłączeń do linuksa.
źródło
df
nie zawsze podać nazwę urządzenia, ale kiedyś się dowiązania do niego jakby/dev/disk/by-uuid/ca09b761-ae1b-450f-8a46-583327b48fb4
codf
nie są wiarygodne. Jedyną dotychczas niezawodną opcją jest zastosowaniestat
rozwiązania opartego na bazie .df
urządzenia, jest ono spójne między dwoma wywołaniami, więc można je porównać.df
raport/dev/sda6
i/dev/disk/by-uuid/ca09b...
oba odnoszą się do tego samego urządzenia, ale różne punkty montowania. Test porównania ciągów oczywiście kończy się niepowodzeniem podczas próby z plikami z każdego punktu montowania.mount /dev/sda6 /mnt1
a następniemount /dev/sda6 /mnt2
działa jak urok.cat /proc/mounts
jest z tym w porządku. Jednak dopiero od czasu, gdy Wheezy/dev/disk/by-uuid/ca09b...
jest pokazanydf
jako urządzenie dla głównego systemu plików. Dalsze próby montowania go za pomocą tego linku prostego lubUUID=ca09b...
składni montowania nie kończą się pokazywaniem niczego innego niż/dev/sda6
wdf
(nie wiem, jak odtworzyć to, co zrobiono podczas procesu rozruchu, ale nie o to tu chodzi).Działa z dowolną liczbą ścieżek.
źródło
df
to nie zawsze jest dobrym pomysłem .$6
), a nie nazwę urządzenia ($1
), więc nie powinno to stanowić problemu.Najlepszym niezawodnym rozwiązaniem dostępnym w POSIX jest porównanie identyfikatorów urządzeń plików dostarczonych przez funkcję stat (2) .
Perl ma podobną funkcję statystyczną, jak zauważył Gilles :
ale „sposobem POSIX” jest użycie programu C, takiego jak:
który kod źródłowy jest następujący:
Jeśli identyfikatory urządzeń obu plików są równe, są one hostowane w tym samym systemie plików, w którym to przypadku powyższe polecenia zwracają 0 (w przeciwnym razie inna wartość). Sprawdź za pomocą
echo $?
.Działa to dobrze z mocowaniami łączenia, ale prawdopodobnie nie będzie z mocowaniami sieciowymi.
źródło