在OSX上使用磁盘卷名填充数组 - 包含空格

时间:2014-10-24 19:56:54

标签: php macos command-line sed osx-mavericks

现在我正在使用下面的命令获取OSX中挂载磁盘的卷名:

$exec = "df -lH | grep \"/Volumes/*\" | tr -s \" \" | sed 's/ /;/g'";

使用以下代码解析输出:

$lines = explode("\n", $output);
$i = 0;
foreach ($lines as $line) {
$driveinfo = explode(";", $line);
$driveinfo[7] = trim($driveinfo[0]);
if (!empty($driveinfo[0]))
$allremovabledrives[$driveinfo[0]] = $driveinfo;
$i++;
}

如果Volume标签中没有空格,这可以正常工作:

[/dev/disk1s1] => Array
    (
        [0] => /dev/disk1s1
        [1] => 32G
        [2] => 31G
        [3] => 674M
        [4] => 98%
        [5] => 0
        [6] => 0
        [7] => /dev/disk1s1
        [8] => /Volumes/LUMIX
    )

但是,如果我安装的磁盘卷名称包含空格,则会添加灾难发生并增加额外的数组值:

[/dev/disk4] => Array
    (
        [0] => /dev/disk4
        [1] => 4.0T
        [2] => 1.2T
        [3] => 2.8T
        [4] => 29%
        [5] => 140741078
        [6] => 347553584
        [7] => /dev/disk4
        [8] => /Volumes/My
        [9] => Passport
        [10] => Pro
    )

有人可以帮我解决这个问题吗?我不熟悉sed和命令行实用程序......

1 个答案:

答案 0 :(得分:1)

好吧,卷名永远是最后一个字段,你知道有多少字段(9),所以我只想在空格上拆分并要求那么多字段。不用担心任何sed / awk / grep / tr这些东西,因为您已经处于一个完整的编程系统中,可以更有效地执行这些命令在自己的流程空间内。

首先,您可以将您想要信息的卷列表作为参数传递给df,这意味着您不需要grep

$df = shell_exec('df -lH /Volumes/*');   

现在拆分换行并删除标题:

$rows = explode("\n", $df);
array_shift($rows);         

开始构建结果:

$result = array();

这里我们不需要使用shell实用程序,只是为了使explode可以用preg_split做的事情。正则表达式/\s+/匹配一行中的一个或多个空白字符,因此我们不会获得额外的字段。限制(9)意味着它只分成9个字段,无论有多少个空格 - 所以最后一个字段中的空格(音量名称)单独留下。

foreach ($rows as $row) {
   $cols = preg_split('/\s+/', $row, 9);   
   $result[$cols[0]] = $cols;
}

毕竟,$result应该看起来像你想要的那样。