您推薦在Linux上獲取磁盤名稱的模塊是什麼?我在CPAN上做了一些搜索,但是我發現的所有模塊都太舊了。在Bash中,我可以使用類似於:perl - Linux上的磁盤名稱
disk_name=$(df |grep -w '/'|awk '{print $1}'|cut -d/ -f3)
echo $disk_name
sda6
請幫我理解如何在Perl中執行相同的操作。 謝謝。
您推薦在Linux上獲取磁盤名稱的模塊是什麼?我在CPAN上做了一些搜索,但是我發現的所有模塊都太舊了。在Bash中,我可以使用類似於:perl - Linux上的磁盤名稱
disk_name=$(df |grep -w '/'|awk '{print $1}'|cut -d/ -f3)
echo $disk_name
sda6
請幫我理解如何在Perl中執行相同的操作。 謝謝。
「正確」的方式列出在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
。與它的一些問題是:
/dev
—住它真的只是一個慣例。/dev
下,它可能是在它的子目錄。例如,我的根文件系統是設備/dev/disk/by-uuid/627f8512-f037-4c6c-9892-6130090c0e0f
上。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"
}
一種方式來做到這你在做什麼的問題
df/| perl -ne 'm"^/\w+/(\w+)";print "$1\n" if defined $1;'
但使用CPAN庫做到這一點可能會更好。
您所描述的不是磁盤名稱,而是代表安裝在根(/)處的分區的塊設備的設備名稱。在普通計算機上,它通常是/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
,其中包含類似的信息,但格式略有不同。
他們的工作,但在這裏有些人勸我不要使用不再支持的模塊,並報告許多錯誤。 – Andrew 2012-02-13 20:34:12
首先,DF不返回磁盤名稱。而是報告已安裝文件系統的安裝點。使用grep,awk和切入管道是一個浪費流程! Awk可以做你所展示的所有東西,Perl當然也可以。 – JRFerguson 2012-02-13 20:36:50
這就是爲什麼我想學習如何在Perl做相同) – Andrew 2012-02-13 20:42:49