You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Perl中调用带管道的Linux命令并正确捕获输出

问题根因

你使用了find的-print0参数,该参数会让find输出的文件名以ASCII 0(null字符)分隔,但后续的du命令没有配置对应读取null分隔输入的参数,导致文件列表解析错误,统计结果不符合预期。你在命令行运行时得到正确结果属于巧合,一般是目标路径下不存在带空格/特殊字符的文件名,才会误打误撞输出正确数值。

解决方法

方案1:保留-print0适配特殊字符文件名

如果你的目录下存在带空格、换行等特殊字符的文件名,需要修改管道命令,给du增加--files0-from=-参数,让其支持读取null分隔的输入:

find /var/opt/ -type f -mtime -1 -print0 | du -s --files0-from=- | cut -f1

对应的Perl捕获代码如下,直接用标量接收单行输出,同时用chomp去除末尾的换行符即可:

my $cmd = 'find /var/opt/ -type f -mtime -1 -print0 | du -s --files0-from=- | cut -f1';
chomp(my $file_size = `$cmd`);
# 此时$file_size就是预期的数值结果

方案2:移除-print0简化命令

如果你确认目标路径下没有带特殊字符的文件名,可以直接删除-print0参数,原命令无需其他修改即可正常运行:

find /var/opt/ -type f -mtime -1 | du -s | cut -f1

对应的Perl代码同步调整即可。

内容的提问来源于stack exchange,提问作者p zankat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 20:27:03