2012-02-13 53 views
1

您推薦在Linux上獲取磁盤名稱的模塊是什麼?我在CPAN上做了一些搜索,但是我發現的所有模塊都太舊了。在Bash中,我可以使用類似於:perl - Linux上的磁盤名稱

disk_name=$(df |grep -w '/'|awk '{print $1}'|cut -d/ -f3) 
echo $disk_name 
sda6 

請幫我理解如何在Perl中執行相同的操作。 謝謝。

+0

他們的工作,但在這裏有些人勸我不要使用不再支持的模塊,並報告許多錯誤。 – Andrew 2012-02-13 20:34:12

+1

首先,DF不返回磁盤名稱。而是報告已安裝文件系統的安裝點。使用grep,awk和切入管道是一個浪費流程! Awk可以做你所展示的所有東西,Perl當然也可以。 – JRFerguson 2012-02-13 20:36:50

+0

這就是爲什麼我想學習如何在Perl做相同) – Andrew 2012-02-13 20:42:49

回答

5

「正確」的方式列出在Linux安裝的磁盤是通過getmntent()系統調用,這可以從Perl中使用Quota模塊進行訪問:

use Quota; 

Quota::setmntent(); 
while (my ($dev, $path, $type, $opts) = Quota::getmntent()) { 
    print "The root device is $dev.\n" if $path eq "/"; 
} 
Quota::endmntent(); 

作爲獎勵,使用配額模塊列出設備掛載點應該相當便於其他Unixish系統,它可以解析各種系統文件,或者輸出df可能不是。不幸的是,這個看似基本的模塊並不包含在標準的Perl發行版中,所以你必須從CPAN(或者從你的發行版的軟件包庫—,例如Debian/Ubuntu有libquota-perl包)中獲得它。


Ps。簡單地將設備名稱拆分爲/並取第三個元素(如您的cut命令所做的那樣)是而不是安全地將/dev/sdb1轉換爲sdb1。與它的一些問題是:

  1. 所有的塊設備下/dev —住它真的只是一個慣例。
  2. 即使設備文件/dev,它可能是在它的子目錄。例如,我的根文件系統是設備/dev/disk/by-uuid/627f8512-f037-4c6c-9892-6130090c0e0f上。
  3. 有時,設備名稱甚至可能不是一個實際的文件系統路徑:例如,虛擬或內存中的文件系統,如tmpfs通常安裝設備名爲none,但它是可以使用任何設備名稱與他們。

如果你想擺脫/dev/部分,我會使用正則表達式,比如像這樣的建議持保守態度:

if ($dev =~ m(^/dev/(.*)$)s) { 
    print "The directory $path is mounted from device $1 under /dev.\n"; 
} else { 
    print "The directory $path is not mounted from a device under /dev.\n" 
} 
1

一種方式來做到這你在做什麼的問題

df/| perl -ne 'm"^/\w+/(\w+)";print "$1\n" if defined $1;' 

但使用CPAN庫做到這一點可能會更好。

2

您所描述的不是磁盤名稱,而是代表安裝在根(/)處的分區的塊設備的設備名稱。在普通計算機上,它通常是/dev/sdXN/dev/hdXN,其中X是磁盤號(主硬盤通常是A,次要是B等),N是該設備上的分區號。

假設你總是在unix系統上運行,你可以嘗試閱讀/ etc/mtab文件,其中列出了所有的掛載分區,或者特殊文件/proc/mounts,這幾乎是相同的。之後您需要解析它以找到所需的並從中獲取設備名稱。

或者,你可以只運行df作爲一個過程,並得到其輸入到Perl中,像

open(DF, "df|"); 
@mount_points = <DF>; 
close(DF); 

,然後遍歷數據來找到你所需要的東西。我沒有意識到任何可以爲你做這項工作的模塊,但是代碼對我來說似乎很簡單。

P.S.請注意,Max OS X雖然是BSD的衍生產品,但沒有相同的文件結構,因此這種方法無效。在Mac OS X上,您可以讀取文件/etc/fstab.hd,其中包含類似的信息,但格式略有不同。