您推荐在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