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ụ: nfshoặc ext3.
Các -Ttù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/mtabhoặc kết quả mountthay vì sử dụng dfcó thể làm trong một số trường hợp hơn.
/proc/mounts
mount, /etc/mtabthậm chí, thậm chí không phải /proc/mountslà tiêu chuẩn nên không có gì đảm bảo về những gì có thể tìm thấy ở đó ...
-Tcó 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/srcvà có loại hệ thống tệp reiserfs.
Cũng tham khảo để man stattham 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 | awktrạng thái phường.
stattôi không có %mtù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 -lvà sử dụng grep, sedhoặc awkđể tìm dòng đề cập đến thư mục đang đề cập.
/my/path/to/the/directorythực sự là một cái gì đó từ đỉnh núi /my/pathvớ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, awklệ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 --printftạo ra on <mountpoint> typemộ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/dlà đi theo đường dẫn:
... và làm một stat(2)ở mỗi cấp độ, cho đến khi st_devthay đổ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/mtabhoặ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.davfslà hiển nhiên, nhưng những gì về ví dụ fuse.gvfs-fuse-daemonhoặc fuse.avfsdcó 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) %tvà %Tvới các --formattù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-systemtù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, -ltùy chọn không chuẩn .
dfsẽ 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 -ttrên Linux và df -Ttrê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
-ttù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 NFScổ phần (một phần của nfs-commongó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'
mountpointtiệ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, mountpointkhông phải là tiêu chuẩn (không có trong danh sách này ).
mountpointlà 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.