Trong * nix, làm thế nào để xác định hệ thống tập tin mà một tập tin cụ thể được bật?


12

Trong một môi trường unix chung, hiện đại (giả sử GNU / Linux, GNU / Solaris hoặc Mac OS X), có cách nào tốt để xác định đường dẫn tệp tuyệt đối và kiểu hệ thống tệp nào được đặt trên không?

Tôi cho rằng tôi có thể thực thi mountlệnh và phân tích thủ công đầu ra của chuỗi đó và so sánh chuỗi đó với đường dẫn tệp của tôi, nhưng trước khi tôi làm điều đó, tôi tự hỏi liệu có cách nào thanh lịch hơn không.

Tôi đang phát triển một tập lệnh BASH sử dụng các thuộc tính mở rộng và muốn làm cho nó thực hiện đúng (ở mức độ nhỏ có thể) cho nhiều hệ thống tệp và môi trường máy chủ.

Câu trả lời:


19

Lệnh df(1)nhận một hoặc nhiều đối số và sẽ trả về mountpoint và thiết bị mà tập tin hoặc thư mục đó tồn tại, cũng như thông tin sử dụng. Sau đó, bạn có thể sử dụng đường dẫn hoặc thiết bị để tra cứu loại hệ thống tệp trong đầu ra mount -vhoặc tương tự.

Thật không may, định dạng đầu ra của cả hai dfmountphụ thuộc vào hệ thống; không có tiêu chuẩn rõ ràng, ít nhất là như tôi có thể thấy giữa Solaris, NetBSD và Mac OS X.


1
df -Pnên tạo đầu ra được tiêu chuẩn hóa trên bất kỳ hệ thống tuân thủ POSIX nào. Một số hệ thống goofier có thể yêu cầu biến môi trường ma thuật, chẳng hạn như POSIXLY_CORRECT, cũng được đặt.
Dan

Ví dụ df /path-to-the-directorysẽ cung cấp cho bạn phân vùng chứa thư mục đó
Hasanuzzaman Sattar

7

Bạn có thể sử dụng stat . Lệnh stat --printf '% d' filename.txt sẽ trả về số thiết bị là hex / thập phân.


Vì vậy, làm thế nào để tìm tên thiết bị dựa trên đó?
cúc

Bạn cần truy cập mặc dù tất cả các tệp thiết bị trong / dev / và tìm kiếm một tệp có cùng số phụ như stat đã báo cáo.
Wiesław Herr

stat --printf "%d"sẽ cho bạn biết số lượng nhỏ của một thiết bị, nhưng còn nhiều việc phải làm để có được tên thiết bị và hệ thống tệp được gắn.
Craig McQueen

2
Có thể đó là một bổ sung gần đây nhưng stat --format '%m' $filesẽ cung cấp cho bạn điểm gắn kết và stat --file-system --format '%T' $mountsẽ cung cấp tên loại hệ thống tệp.
roaima

1
@TomHale: đừng nhớ, thành thật mà nói. Nhưng tôi nhớ nó không hoạt động. Phải thừa nhận rằng tôi đã tuyên bố bản phân phối, phiên bản kernel, v.v. Nhưng bạn nói rằng nó hoạt động, cũng có thể có nghĩa là nó đã được sửa trong khi đó. Nếu kết quả cuối cùng là nó hoạt động, thật tuyệt :)
0xC0000022L


2

Hừm. Đối với điểm gắn kết, bạn có thể đi lên cấu trúc phân cấp cho đến khi st_dev thay đổi (khi đó bạn vừa vượt qua một ranh giới gắn kết); Có GNU statcho bash script; tuy nhiên, tôi không biết làm thế nào bạn có thể đoán loại hệ thống tập tin mà không cần phân tích cú pháp /proc/mountshoặc bằng cách dùng thử và lỗi (nghĩa là xử lý các lỗi sau khi đặt thuộc tính mở rộng)


2

Một điều đáng chú ý khi sử dụng dflà nếu tên thiết bị trong đầu ra dài thì dòng sẽ bị ngắt, do đó bạn không thể lấy dòng cuối cùng. Thay vào đó, hãy loại bỏ dòng đầu tiên và sau đó lấy dòng đầu tiên mới và sau đó in trường đầu tiên:

#!/usr/bin/env bash

path=$1
curdir=$(pwd)
cd $path
df . | tail -n +2 | head -1 | awk '{print $1}'
cd $curdir

3
Tránh vấn đề này bằng cách sử dụng 'df -P' để nhận đầu ra ở định dạng POSIX và không ngắt dòng.
MikeyB

2

Dường như có một nhược điểm với df và btrfs trên Linux. Khi bạn yêu cầu df xác định vị trí gắn kết cho âm lượng btrfs được gắn, nó sẽ thực hiện đúng. Trong trường hợp này, joe là một thư mục con của / m / whale / backup.

# df /srv/backup/joe
Filesystem      1K-blocks      Used  Available Use% Mounted on
/dev/md126     2930135488 307676684 2619663252  11% /m/whale/backup

Nhưng nếu thư mục đang được tham chiếu là một tập con, nó sẽ không cho bạn biết điểm gắn kết nữa.

# df /srv/backup/joe/code
Filesystem      1K-blocks      Used  Available Use% Mounted on
-              2930135488 307676684 2619663252  11% /a/whale/backup/joe/code

/ A / whale / backup là điểm gắn kết duy nhất theo kernel.

# mount | grep whale
/dev/md126 on /a/whale/backup type btrfs (rw,relatime,space_cache)

FWIW, stat làm điều tương tự:

# stat --printf '%m\n' /srv/backup/joe/code
/a/whale/backup/joe/code

1

Từ /programming/2167558/give-the-mount-point-of-a-path :

 df -P $path  | tail -1 | awk '{ print $NF}'

hoạt động ở mọi nơi tôi đã thử nghiệm, cho cả * BSD và sysV, và cho các thư mục tự động lập dị. Tôi rất vui mừng khi nghe về một trường hợp thất bại.


1
Mã đề xuất df -P $ path | đuôi -1 | awk '{print $ NF}' không thành công trên tất cả các phiên bản Solaris mà tôi đã thử (2.5.1, 8, 9 và 10) vì Solaris 'không có hỗ trợ tùy chọn của Solaris'.
Peter John Acklam

@Peter: Tôi ít vui mừng hơn tôi nghĩ tôi sẽ làm. Nhưng thật thú vị khi biết rằng vấn đề là không cần thiết. Tôi nghĩ điều đúng đắn là viết một lệnh bằng ngôn ngữ kịch bản mà thư viện đã giải quyết vấn đề một cách chính xác, ví dụ: Python có hàm os.path.splitunc () cung cấp điểm gắn kết và tôi giả sử hoạt động trên Solaris.
Charles Stewart

@CharlesStewart: Đáng buồn thay, theo hiểu biết của tôi về Python. os.path.splitunc()chỉ hoạt động cho các đường dẫn UNCchỉ khả dụng trên Windows .
Aleksi Torhamo
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.