Câu trả lời:
Như Stephane nói "không có câu trả lời Unix phổ quát cho điều đó".
Giải pháp tốt nhất tôi đã tìm thấy cho câu hỏi của mình:
df -P -T /my/path/to/folder | tail -n +2 | awk '{print $2}'
sẽ trả về kiểu hệ thống tập tin, ví dụ: nfs
hoặc ext3
.
Các -T
tùy chọn là không chuẩn , vì vậy nó không thể làm việc trên các hệ thống Unix / Linux khác ...
Theo nhận xét của Gilles bên dưới: "Điều này hoạt động trên mọi Linux không nhúng, nhưng không phải trên BusyBox, * BSD, v.v."
/etc/mtab
hoặc kết quả mount
thay vì sử dụng df
có thể làm trong một số trường hợp hơn.
/proc/mounts
mount
, /etc/mtab
thậm chí, thậm chí không phải /proc/mounts
là tiêu chuẩn nên không có gì đảm bảo về những gì có thể tìm thấy ở đó ...
-T
có một ý nghĩa khác ở đây
Bạn có thể sử dụng GNU stat
.
%m
để tìm ra điểm gắn kết.
$ stat --format=%m /usr/src/linux
/usr/src
%T
(ở chế độ hệ thống tệp) để tìm ra tên của hệ thống tệp.
$ stat --file-system --format=%T /usr/src/linux
reiserfs
Vì vậy, bạn biết rằng /usr/src/linux
, trên hệ thống của tôi, được lưu trữ trong một hệ thống tệp được gắn trên /usr/src
và có loại hệ thống tệp reiserfs
.
Cũng tham khảo để man stat
tham khảo thêm. Đó là một lệnh rất linh hoạt, hầu như luôn hữu ích khi bạn cần thông tin về các tệp và không muốn quay trở lại grep | awk
trạng thái phường.
stat
tôi không có %m
tùy chọn cho --format
(sử dụng Debian Squeeze, coreutils 8.5). Vì vậy, tôi đoán giải pháp này không đáng tin cậy lắm.
2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file
. Đó là gần 3 năm trước. Thật ngạc nhiên khi Debian vẫn không có thứ này.
mount -l
và sử dụng grep
, sed
hoặc awk
để tìm dòng đề cập đến thư mục đang đề cập.
/my/path/to/the/directory
thực sự là một cái gì đó từ đỉnh núi /my/path
với câu trả lời của bạn. Có lẽ bạn có thể cho một số chi tiết về grep
, sed
, awk
lệnh bạn đề nghị (một câu trả lời đầy đủ) ?.
mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'
sẽ cung cấp cho bạn một danh sách tất cả các điểm gắn kết nfs trên hệ thống.
mount | fgrep "`stat --printf=" on %m type" /var/log/`". The
lệnh stat: mount` sẽ in tất cả các điểm gắn kết, ở <device> on <mountpoint> type <type>
định dạng. Để grep này, tôi đã stat --printf
tạo ra on <mountpoint> type
một phần.
Thật không may, không có câu trả lời Unix phổ quát cho điều đó.
Một điều bạn có thể làm, đối với một tệp đã cho /a/b/c/d
là đi theo đường dẫn:
... và làm một stat(2)
ở mỗi cấp độ, cho đến khi st_dev
thay đổi. Sau đó, bạn sẽ biết điểm gắn kết ở đâu. Sau đó, bạn có thể tra cứu đường dẫn chính tắc của điểm gắn kết đó trong /etc/mtab
hoặc trong đầu ra của mount
để tìm ra loại hệ thống tệp. Sau đó, tìm ra những gì là từ xa và những gì không phải là sẽ khó khăn đặc biệt là đối với những loại cầu chì. Ví dụ, nfs
, cifs
, fuse.sshfs
, fuse.davfs
là hiển nhiên, nhưng những gì về ví dụ fuse.gvfs-fuse-daemon
hoặc fuse.avfsd
có thể có cả hai tập tin mạng và ngoài mạng lưới?
stat(2)
, tôi nghĩ rằng bạn đang giới thiệu chức năng C, nhưng tôi đang sử dụng shell. Tuy nhiên, st_dev
đề cập đến ID thiết bị chính và phụ (có phải là Linux cụ thể không?) Và lệnh shell stat(1)
có (không chuẩn) %t
và %T
với các --format
tùy chọn cho các số chính và phụ tương ứng, nhưng nó luôn trả về "0" (cục bộ và nfs ). Tôi đã thử trên Debian Squeeze và Lenny.
--file-system
tùy chọn?
--file-system
.
"-L" đến df (1) sẽ không thành công với lỗi trên các hệ thống tệp không cục bộ, vì vậy bạn có thể sử dụng hành vi này để biết hệ thống tệp có ở xa không:
df -l /path 2> /dev/null | grep -q "File"
rc=$?
if [ "$rc" = "0" ]
then
echo "local mount, do stuff"
fi
Tuy nhiên, -l
tùy chọn không chuẩn .
df
sẽ thất bại và điều đó một mình làm cho đây là một câu trả lời không hay, nhưng nó đang cố gắng trả lời câu hỏi vì vậy tôi không hiểu tại sao bạn gọi nó là "không phải là một câu trả lời".
Bạn có thể sử dụng df -t
trên Linux và df -T
trên các hệ thống BSD.
Từ người đàn ông df :
-t, --type = LOẠI
giới hạn danh sách cho các hệ thống tệp loại TYPE
if df -t nfs | grep -q /path/to/folder$; then
# it is an NFS
fi
-t
tùy chọn này có ý nghĩa khác trong POSIX / SUS. Vì vậy, sử dụng tùy chọn này có thể cung cấp kết quả không nhất quán trong các phiên bản khác nhau trên công cụ / UNIX.
Cá nhân tôi sẽ sử dụng mountpoint
(rất di động trên Linux!):
NAME
mountpoint - see if a directory is a mountpoint
SYNOPSIS
mountpoint [-d|-q] directory
hoặc showmount
được yêu cầu khá nhiều để cài đặt trên bất kỳ hệ thống nào thực sự gắn kết NFS
cổ phần (một phần của nfs-common
gói):
NAME
showmount - show mount information for an NFS server
SYNOPSIS
showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]
Một lựa chọn khác sẽ đôi khi như:
$ mount -l -t nfs | grep 'my mount point'
mountpoint
tiện ích không cho bạn biết nếu điểm gắn kết là từ xa. Hơn nữa, các hệ thống tập tin từ xa không bị giới hạn trong các hệ thống tập tin NFS. Cuối cùng, mountpoint
không phải là tiêu chuẩn (không có trong danh sách này ).
mountpoint
là tiêu chuẩn trong trường hợp này.
find . -type d -name nfs -exec mountpoint {} \; | grep not
sẽ kiểm tra tất cả các thư mục có tên 'nfs' nếu chúng được gắn kết
nfs
.