Làm thế nào tôi có thể xác định loại fs của thư mục làm việc hiện tại của tôi?


19

Tôi cần một cách độc lập và nhẹ nhàng để phát hiện loại gắn CWD của tôi. Cụ thể, tôi cần xác định xem CWD của tôi có nằm trong SSHFS, NFS, CIFS, SMB hoặc khối lưu trữ khối cục bộ không.

Tôi cần phải làm điều này trên Mac OSX 10.6, 10.7 và RHEL5 (tối thiểu).

Có khả năng sử dụng df, nhưng df hoạt động hoàn toàn khác nhau trên hai nền tảng này. Thêm vào đó, tôi phải CLI cạo đầu ra của nó bằng awk, trong khi khả thi là ... dễ vỡ.

Thông tin này phải có sẵn ở một số cấp độ. Có một công cụ mà tôi không biết có thể cung cấp thông tin này cho tôi không?

Câu trả lời:


17

Kiểu hệ thống tập tin không phải là thứ bạn có thể dễ dàng truy cập theo cách độc lập với hệ điều hành. Tên loại hệ thống tệp phụ thuộc vào hệ điều hành, do đó không có bất kỳ sự khuyến khích nào để thiết lập một phương thức chuẩn.

Trên các hệ thống Linux không nhúng, stat -f -c %T .hiển thị loại hệ thống tệp của thư mục hiện tại. statLệnh của OSX không có bất cứ thứ gì như thế này.

Vì tất cả những gì bạn muốn biết là loại hệ thống tệp có nằm trong danh sách hữu hạn hay không, trong Linux, bạn có thể giới hạn cả bộ đường dẫn để in thông tin cho và bộ loại hệ thống tệp. Bạn sẽ gặp lỗi (Tiếng df: không có hệ thống tệp nào được xử lý) nếu loại hệ thống tệp của thư mục hiện tại không có trong danh sách.

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

Cú pháp tương tự có thể hoặc không thể hoạt động trên OSX; Nếu không, hãy thử df -T sshfs,nfs,cifs ..


Đây chính xác là những gì tôi cần. Gilles bạn thật tuyệt!
ARX

7

Bạn có thể sử dụng GNU GNU trên Linux:

stat --file-system --format=%T /tmp/subdir/whatever
tmpfs

Điều này là tuyệt vời bởi vì nó hoạt động trên các thư mục con. Cảm ơn!
Avindra Goolcharan

4

Trên Linux, có sẵn findmnt kể từ produc-linux 2.18.

findmnt -n -o FSTYPE -T /home
nfs4

Không hoạt động cho / home / subir, vì vậy nó sẽ không giúp OP.
Eloff

Đối với tôi nó cũng hoạt động cho các thư mục con, sử dụng findmount từ produc-linux 2.23.
rudimeier

3

Không thử nghiệm nó, nhưng df -Pnên hoạt động giống nhau trên hầu hết các nền tảng.

Điều này hoạt động trên Linux.

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

Hoặc phá vỡ nó thành các chức năng có thể tái sử dụng:

# 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 ' '
}

Và gọi hàm:

get_fs $(get_mount .)

Có thể được viết lại để nhanh hơn một chút bằng cách sử dụng sedhoặc awk, nhưng cách này có lẽ dễ đọc hơn.

Nếu điều này không hiệu quả, bạn có thể thử một cái gì đó tương tự, nhưng sử dụng /etc/mtabchứ không phải đầu ra mount.


Cái Ptrong df -Plà dành cho POSIX, vì vậy nó nên hoạt động theo cùng một cách. Tuy nhiên, việc đi từ đường dẫn hệ thống tập tin đến điểm gắn kết sẽ khó khăn hơn.
Gilles 'SO- ngừng trở nên xấu xa'

1
Giải pháp của bạn dường như không an toàn nếu thư mục được gắn với vòng lặp -o. Ít nhất trên hệ thống của tôi df hiển thị thiết bị vòng lặp đã sử dụng nhưng mount hiển thị tệp hình ảnh được sử dụng. Tôi đoán rằng thậm chí có thể có nhiều trường hợp trong đó df không hiển thị cùng một thiết bị như mount. Lưu ý trích dẫn này từ trang man của mount "Chế độ liệt kê được duy trì để chỉ tương thích ngược. Để đầu ra mạnh mẽ và chắc chắn hơn, hãy sử dụng findmnt (8), đặc biệt là trong các tập lệnh của bạn."
rudimeier
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.