如何用正则表达式解析Linux stat命令输出(PHP preg_match实现)
PHP提取Linux stat命令输出字段实现方案
直接使用以下代码即可通过preg_match一次性提取所有目标字段,正则已适配主流Linux发行版默认stat输出格式:
<?php // 实际使用时替换为你执行stat命令获取的真实输出内容 $statOutput = <<<STAT File: '/home/user/file.php' Size: 23283 Blocks: 48 IO Block: 4096 regular file Device: 801h/2049d Inode: 967703 Links: 1 Access: (0600/-rw-------) Uid: ( 1002/user) Gid: ( 1003/user) Access: 2022-06-06 07:12:31.298324852 -0400 Modify: 2022-06-02 07:54:24.493383727 -0400 Change: 2022-06-02 07:54:43.548316545 -0400 Birth: 2022-06-02 07:12:31.298324852 -0400 STAT; // 匹配所有目标字段的正则规则 $pattern = '/File:\s*\'([^\']+)\'\s*Size:\s*(\d+)\s*.*?IO Block:\s*\d+\s*([a-zA-Z ]+)\s*Device:.*?Access:\s*\([^)]+\/([^)]+)\)\s*Uid:\s*\(\s*\d+\/([^)]+)\)\s*Gid:\s*\(\s*\d+\/([^)]+)\)\s*Access:.*?Modify:\s*([0-9:\-\. ]+)\s*Change:.*?Birth:\s*([0-9:\-\. ]+)/s'; preg_match($pattern, $statOutput, $matches); // 结果映射,可直接传入后续业务逻辑使用 $fileInfo = [ 'filename' => trim($matches[1]), // 文件完整路径/文件名 'size' => (int)$matches[2], // 文件大小,单位:字节 'file_type' => trim($matches[3]), // 文件类型 'permission' => trim($matches[4]), // 访问权限字符串 'owner_user' => trim($matches[5]), // 所属用户名 'owner_group' => trim($matches[6]), // 所属用户组 'modify_time' => trim($matches[7]), // 最后修改时间 'create_time' => trim($matches[8]) // 文件创建时间(Birth字段) ]; // 验证输出 print_r($fileInfo); ?>
使用说明
- 正则添加了
s修饰符,支持直接匹配整段带换行的stat输出,不需要逐行拆分处理 - 提取的时间字段保留stat原始输出格式,需要转时间戳可直接调用
strtotime()函数处理 - 文件大小为整数类型的字节值,可直接用于容量计算
- 如果需要提取数字格式的权限(如
0600),只需要调整正则中权限捕获组的匹配规则即可 - 若服务器locale配置、stat版本不同导致输出格式有小幅差异,微调正则对应位置的匹配规则即可适配
运行结果示例
Array ( [filename] => /home/user/file.php [size] => 23283 [file_type] => regular file [permission] => -rw------- [owner_user] => user [owner_group] => user [modify_time] => 2022-06-02 07:54:24.493383727 -0400 [create_time] => 2022-06-02 07:12:31.298324852 -0400 )
内容的提问来源于stack exchange,提问作者tenev
相关产品推荐
相关产品推荐

