2010-01-30 36 views
12

Sau đây, mã shell rất phi mạnh mẽ sẽ cung cấp cho các mount point của $path:Cho mount point của một con đường

 
(for i in $(df|cut -c 63-99); do case $path in $i*) echo $i;; esac; done) | tail -n 1 

Có cách nào tốt hơn để làm điều này trong vỏ?

Postscript

Kịch bản này thực sự là khủng khiếp, nhưng có chất lượng cứu chuộc mà nó hoạt động trên hệ thống của tôi. Lưu ý rằng một số điểm gắn kết có thể là tiền tố của $path.

Ví dụ Trên một hệ thống Linux:

 
[email protected]:~$ path=/sys/block/hda1 
[email protected]:~$ for i in $(df -a|cut -c 57-99); do case $path in $i*) echo $i;; esac; done| tail -1 
/sys 

Trên một hệ thống Mac OSX

 
cas local$ path=/dev/fd/0 
cas local$ for i in $(df -a|cut -c 63-99); do case $path in $i*) echo $i;; esac; done| tail -1 
/dev 

Lưu ý cần thay đổi các thông số cắt, bởi vì sản lượng đường df của khác; sử dụng awk giải quyết điều này, nhưng ngay cả awk là không di động, được đưa ra loạt các định dạng kết quả thực hiện khác nhau của sự trở lại df.

trả lời Dường như munging đầu ra bảng là cách duy nhất bên trong vỏ, nhưng

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

dựa trên câu trả lời của ghostdog74, là một cải tiến lớn về những gì tôi đã có. Lưu ý hai vấn đề mới: trước tiên, df $path khẳng định rằng $path đặt tên tệp hiện có, tập lệnh tôi đã nêu ở trên không quan tâm; thứ hai, không có lo lắng về các liên kết dereferencing. Điều này không có tác dụng nếu bạn có các điểm gắn kết với khoảng trống trong chúng, điều này xảy ra nếu có một phương tiện có thể tháo rời với các dấu cách trong các tên khối lượng của chúng.

Không khó để viết mã Python để thực hiện công việc đúng cách.

+0

Cf. http://serverfault.com/questions/66492/in-nix-how-to-determine-which-filesystem-a-particular-file-is-on –

+0

Xem câu trả lời của tôi cho phiên bản của "df" $ path " 'lệnh hoạt động khi thiết bị hoặc điểm gắn kết có dấu cách trong đó. – crashmaxed

Trả lời

17

df lấy đường dẫn làm thông số, vì vậy một cái gì đó như thế này sẽ khá mạnh mẽ;

df "$path" | tail -1 | awk '{ print $6 }' 
+1

Như ndim nói, điều này không làm việc cho tôi vì các dòng bọc trong đầu ra df gây ra bởi tên LVM. Lệnh quota có tùy chọn --no-wrap nhưng df dường như không có. – ygoe

+1

df có tùy chọn -P để không quấn. Các phiên bản mới hơn của GNU df không bị quấn. – pixelbeat

+0

Đó là giá trị tài liệu mà điều này không làm việc cho các điểm gắn kết với không gian trong đường dẫn của họ. Tôi đã chấp nhận câu trả lời này bởi vì nó là câu trả lời tốt nhất cho đến nay và tôi đã dựa trên giải pháp ưa thích của tôi trên đó. –

1

tôi không biết những gì đầu ra mong muốn của bạn là, do đó đây là một đoán

#!/bin/bash 

path=/home 
df | awk -v path="$path" 'NR>1 && $NF~path{ 
print $NF 
}' 

Sử dụng cắt bằng -c không thực sự đáng tin cậy, vì đầu ra của df sẽ khác nhau, nói một 5% có thể thay đổi thành 10% và bạn sẽ bỏ lỡ một số ký tự. Vì điểm gắn kết luôn ở phía sau, bạn có thể sử dụng các trường và dấu phân tách trường. Trong phần trên, $ NF là cột cuối cùng là điểm gắn kết.

+0

Vâng, awk là tốt hơn so với cắt, nhưng tôi thực sự muốn thoát khỏi phân tích cú pháp đầu ra của df. Lưu ý rằng các điểm gắn kết được sắp xếp theo cấp bậc. –

+0

hiển thị đường dẫn $ là gì và hiển thị kết quả mong muốn của bạn. cung cấp càng nhiều thông tin trong câu hỏi của bạn càng tốt. – ghostdog74

13

Lý thuyết stat sẽ cho bạn biết thiết bị đang bật và cần có cách nào đó để ánh xạ thiết bị đến điểm lắp.

Ví dụ, trên linux, điều này sẽ làm việc:

stat -c '%m' $path 
+0

Tôi thích gợi ý này, nhưng trên mac os 10.4, chạy 'stat -f"% Sdr "' trả về '??? r' cho hầu hết các hệ thống tập tin. –

+0

Tôi đã đăng một qn về hành vi macosx tới SU: http://superuser.com/questions/103755/whats-up-with-stat-on-macos-darwin-or-filesystems-without-names –

+0

Tuyệt vời! Điều này hoạt động nếu thiết bị được gắn trên một đường dẫn có dấu cách, trong khi câu trả lời được chấp nhận không thành công. – mavroprovato

1

tôi sẽ lấy mã nguồn để DF và tìm hiểu những gì nó làm ngoài gọi stat như Douglas Leeder gợi ý.

Line-by-line phân tích cú pháp của df đầu ra sẽ gây ra vấn đề như những dòng thường trông giống như

/dev/mapper/VOLGROUP00-logical--volume 
         1234567 1000000 200000 90% /path/to/mountpoint 

Với sự phức tạp gia tăng của phân tích những loại đường là tốt, có thể gọi stat và tìm mountpoint ít phức tạp hơn.

0
mount | grep "^$path" | awk '{print $3}' 
+0

Điều này sẽ chỉ tìm thấy điểm gắn kết từ tệp thiết bị, trong đó 'lsblk' hoặc' findmnt' tốt hơn nhiều. – Graeme

0

tôi sử dụng này:

df -h $path | cut -f 1 -d " " | tail -1 
0

Linux có này, mà sẽ tránh vấn đề với không gian:

lsblk -no MOUNTPOINT ${device} 

Không chắc về đất BSD.

+1

Điều này không trả lời được câu hỏi vì nó yêu cầu tệp thiết bị và sẽ không hoạt động với bất kỳ đường dẫn nào. – Graeme

4

Luôn là người hâm mộ sử dụng các tùy chọn định dạng của chương trình vì nó có thể mạnh mẽ hơn thao tác đầu ra (ví dụ: nếu điểm gắn kết có dấu cách). GNU df cho phép những điều sau đây:

df --output=target "$path" | tail -1 

Thật không may là không có tùy chọn nào tôi có thể thấy để tránh in đầu trang, vì vậy đuôi vẫn được yêu cầu.

+1

Sử dụng '--output = source' để lấy thiết bị khối đường dẫn được gắn kết. – coldfix

0
f() { echo $6; }; f $(df -P "$path" | tail -n 1) 
0

Nếu bạn muốn sử dụng chỉ df và awk để tìm các thiết bị hệ thống tập tin/cổ phiếu từ xa hoặc một điểm gắn kết và chúng bao gồm không gian bạn có thể gian lận bằng cách xác định tách lĩnh vực awk là một biểu thức chính quy phù hợp với định dạng của các kích thước số được sử dụng để hiển thị tổng kích thước, không gian đã sử dụng, không gian có sẵn và phần trăm dung lượng. Bằng cách xác định các cột đó dưới dạng dấu phân tách trường, bạn sẽ được để lại với $1 đại diện cho thiết bị hệ thống tập tin/chia sẻ từ xa và $NF đại diện cho đường kết nối.

Cầm lấy cái này ví dụ:

[[email protected] ~] df -P 
Filesystem      1024-blocks  Used Available Capacity Mounted on 
192.168.0.200:/NFS WITH SPACES 11695881728 11186577920 509303808  96% /mnt/MOUNT WITH SPACES 

Nếu bạn cố gắng để phân tích điều này với các nhanh chóng và dơ bẩn awk '{print $1}' hoặc awk '{print $NF}' bạn sẽ chỉ nhận được một phần của con đường cổ phần hệ thống tập tin/từ xa và gắn kết con đường và đó là không tốt. Bây giờ làm cho awk sử dụng bốn cột dữ liệu số làm dấu tách trường.

[[email protected] ~] df -P "/mnt/MOUNT WITH SPACES/path/to/file/filename.txt" | \ 
awk 'BEGIN {FS="[ ]*[0-9]+%?[ ]+"}; NR==2 {print $1}' 
192.168.0.200:/NFS WITH SPACES 

[[email protected] ~] df -P "/mnt/MOUNT WITH SPACES/path/to/file/filename.txt" | \ 
awk 'BEGIN {FS="[ ]*[0-9]+%?[ ]+"}; NR==2 {print $NF}' 
/mnt/MOUNT WITH SPACES 

Thưởng thức :-)

Edit: Các lệnh này được dựa trên RHEL/CentOS/Fedora nhưng nên làm việc trên chỉ là về bất kỳ phân phối.

Các vấn đề liên quan