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

如何用BSD stat命令生成NUL分隔的带时间戳文件名流

BSD系统生成NUL分隔的带时间戳文件名流的高效方案

核心需求

在BSD系统下,高效生成NUL分隔的「纳秒精度时间戳+文件名」数据流,需避免逐个调用stat的低效方式(处理大量文件时进程启动开销过大)。

方案1:Perl批量处理(最可靠高效)

利用Perl内置的stat函数直接获取文件元数据,无需反复启动外部进程,同时能正确处理包含特殊字符(如换行)的文件名:

perl -e '
    foreach my $file (@ARGV) {
        my @stat = stat($file);
        next unless @stat;  # 跳过获取信息失败的文件
        printf "%.9f %s\0", $stat[9], $file;
    }
' -- /path/to/your/targets
  • 说明:$stat[9]对应文件的修改时间戳(epoch秒),%.9f输出纳秒精度,和Linux/Solaris的%.9Y格式完全匹配;输出末尾用\0作为分隔符,严格符合需求。
  • 优势:单进程处理所有文件,性能最优,且无特殊字符处理风险。

方案2:find + stat + tr(兼容基础环境)

如果系统未安装Perl,可通过find的批量执行能力减少stat的调用次数,再将换行转为NUL:

find /path/to/your/targets -maxdepth 1 -exec stat -f '%.9Fm %N' {} + | tr '\n' '\0'
  • 说明:-exec ... +会将尽可能多的文件一次性传给stat,大幅降低进程启动次数;tr '\n' '\0'把stat输出的换行分隔转为NUL分隔。
  • 注意:若文件名包含换行符,此方法会错误地将文件名内的换行转为NUL,导致数据损坏,仅适用于文件名无特殊字符的场景。

方案3:xargs + stat + tr(自定义路径列表)

如果需要传入任意路径列表(而非通过find遍历),可先用printf生成NUL分隔的路径,再通过xargs批量传给stat:

printf "%s\0" /path/to/file1 /path/to/file2 /path/to/group/* | xargs -0 stat -f '%.9Fm %N' | tr '\n' '\0'
  • 说明:printf "%s\0"确保路径以NUL分隔传入xargs,xargs -0正确解析;同样通过tr转换分隔符。
  • 局限:同方案2,无法处理含换行的文件名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:50:40