您建议在Linux上获取磁盘名称的模块是什么?我已经对CPAN进行了一些搜索,但我找到的所有模块都太旧了。在Bash中我可以使用类似的东西:
disk_name=$(df |grep -w '/'|awk '{print $1}'|cut -d/ -f3)
echo $disk_name
sda6
请帮助我了解如何在Perl中执行相同的操作。 感谢。
答案 0 :(得分:5)
在Linux上列出已安装磁盘的“正确”方法是通过getmntent()
系统调用,可以使用Quota模块从Perl访问:
use Quota;
Quota::setmntent();
while (my ($dev, $path, $type, $opts) = Quota::getmntent()) {
print "The root device is $dev.\n" if $path eq "/";
}
Quota::endmntent();
作为奖励,使用Quota模块列出设备挂载点应该相当容易移植到其他Unixish系统,解析各种系统文件或df
的输出可能不是。不幸的是,这个看似基本的模块没有包含在标准的Perl发行版中,所以你必须从CPAN(或从你的发行版的软件包库中获取它 - 例如,Debian / Ubuntu有libquota-perl包)。
聚苯乙烯。只需在/
上拆分设备名称并取第三个元素(如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"
}
答案 1 :(得分: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
,其中包含类似的信息,但格式略有不同。
答案 2 :(得分:1)
在问题中做你正在做的事情的一种方法
df / | perl -ne 'm"^/\w+/(\w+)";print "$1\n" if defined $1;'
但使用CPAN库可能会更好。