2012-02-13 58 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,其中包含类似的信息,但格式略有不同。