2010-01-30 52 views
12

下的掛載點,極不堅固的外殼代碼會給$path安裝點:給路徑

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

有沒有更好的方式外殼做到這一點?

後記

這個腳本實在太可惜,但贖回的質量,它適用於我的系統。請注意,多個掛載點可能是前綴$path

例子 在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 

在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 

注意需要改變,因爲DF的方式輸出不同的切的參數;使用awk可以解決這個問題,但即使awk也是不可移植的,因爲結果的格式範圍是df返回的各種實現。

回答 它看起來像改寫(munging)表格輸出是外殼內的唯一途徑,但

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

基於ghostdog74的回答,是什麼我有一個大的提升。注意兩個新問題:首先,df $path堅持認爲$path命名現有文件,我上面的腳本並不在意;其次,不用擔心解引用符號鏈接。如果您的掛載點中有空格,則這不起作用,如果其中的卷名具有空格的可移動介質,則會發生這種情況。

編寫Python代碼正確完成工作並不困難。

+0

參考http://filesfault.com/questions/66492/in-nix-how-to-determine-which-filesystem-a-particular-file-is-on – 2010-02-08 14:27:50

+0

請參閱我對「df」$ path路徑的回答「 '當設備或安裝點在其中有空格時起作用。 – crashmaxed 2014-04-03 16:29:05

回答

17

df將路徑作爲參數,所以像這樣的東西應該是相當健壯的;

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

正如ndim所說,由於LVM名稱導致的df輸出中包含行,這對我來說不起作用。 quota命令有一個--no-wrap選項,但df似乎也沒有。 – ygoe 2010-09-19 11:29:35

+1

df有-P選項不能換行。 GNU df的較新版本根本不包裝。 – pixelbeat 2012-08-01 10:58:23

+0

值得記錄的是,這不適用於其路徑中具有空格的裝入點。我已經接受了這個答案,因爲這是迄今爲止答案中最好的答案,我已經根據我的首選解決方案。 – 2016-06-29 10:03:24

1

我不知道你的期望的輸出是什麼,因此,這是一個猜測

#!/bin/bash 

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

使用切割-c是不是真的可靠,因爲DF的輸出會有所不同,比如說5%可以變成10%,你會錯過一些人物。由於安裝點始終位於後面,所以可以使用字段和字段分隔符。在上面,$ NF是掛載點的最後一列。

+0

是的,awk比cut更好,但是我真的很想解析df的輸出。請注意,掛載點分層組織。 – 2010-01-30 10:53:47

+0

顯示什麼是$路徑,並顯示您所需的輸出。在你的問題中儘可能多地提供信息。 – ghostdog74 2010-01-30 11:26:26

13

理論上stat會告訴你該設備的文件,並且應該有設備映射到安裝點的一些方法。

例如,在Linux上,這應該工作:

stat -c '%m' $path 
+0

我喜歡這個建議,但是在Mac OS 10.4上,對大多數文件系統運行'stat -f「%Sdr」''返回'??? r'。 – 2010-01-30 20:56:58

+0

我已經發布了關於macosx行爲的一個q到SU:http://superuser.com/questions/103755/whats-up-with-stat-o​​n-macos-darwin-or-filesystems-without-names – 2010-02-02 10:42:45

+0

太棒了!如果設備安裝在具有空格的路徑上,而接受的答案失敗,則這起作用。 – mavroprovato 2014-04-26 22:18:21

1

我想借此源代碼DF和找出它除了要求stat道格拉斯Leeder先生指出。

行由行df輸出的解析會造成問題,因爲這些線路往往看起來像

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

在解析這些類線爲好,大概叫stat並找到掛載點的增加的複雜性並不複雜。

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

這隻會從設備文件中找到一個安裝點,lsblk或findmnt要好得多。 – Graeme 2014-01-16 18:25:27

0

我用這個:

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

Linux有這一點,這將避免問題的空間:

lsblk -no MOUNTPOINT ${device} 

不知道關於BSD的土地。

+1

這並不回答這個問題,因爲它需要一個設備文件,並且不適用於任何路徑。 – Graeme 2014-01-16 18:16:49

4

一直以來都是使用程序格式化選項的粉絲,因爲它可以比操縱輸出更健壯(例如,如果裝入點具有空格)。 GNU df允許的情況如下:

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

不幸的是沒有選擇,我可以看到,以防止頭部的印刷,所以仍然需要尾巴。

+1

使用'--output = source'來獲取從中掛載路徑的塊設備。 – coldfix 2016-03-30 11:44:27

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

如果你只想使用DF和awk找到文件系統設備/遠程共享或掛載點,它們包括可以通過定義AWK的字段分隔作弊空間是一個正則表達式匹配用於顯示總大小,已用空間,可用空間和容量百分比的數字大小格式。通過將這些列定義爲字段分隔符,您將剩下代表文件系統設備/遠程共享的$1和代表安裝路徑的$NF

藉此例如:

[[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 

如果您試圖解析這個快速和骯髒的awk '{print $1}'awk '{print $NF}'你只會得到文件系統/遠程共享路徑的一部分和安裝路徑,這就是沒有好。現在讓awk使用四個數字數據列作爲字段分隔符。

[[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 

享受:-)

編輯:這些命令都是基於RHEL/CentOS的/ Fedora的,但應該工作在幾乎任何分配。