coreutils“stat”命令的POSIX模拟?

gav*_*koa 1 shell posix stat gnu-coreutils

Coreutilsstat--format=开关,可以为读者以简单的形式报告有关文件的不同信息(所有者、大小等)。

POSIXls实用程序提供了大部分此类信息,但其输出很难解析。与单线比较:

[ `stat -c '%U' $f` = $USER ] && echo "You own $f" || echo Error!
Run Code Online (Sandbox Code Playgroud)

statPOSIX 中是否有实用程序模拟?

Mar*_*oij 5

这不可能 :-(

您的选择是:

  • 使用ls并解析它awk;的输出ls -l在 POSIX 中,因此您可以依赖它。这适用于某些字段(例如您示例中的所有者),但对其他人(例如 mtime)不太好。

  • 检测stat版本和开关参数;GNU stat-cBSD stat-f,其他版本也许还有别的东西。stat根本不在 POSIX 中,但我不知道它在 Linux、BSD 和 OSX 之外的普及程度如何。

  • 使用 Perl 或 Python one-liner;当然,这甚至不是远程 POSIX,但假设至少存在这些语言中的一种在 2015 年是相当合理的,如果它们确实存在,在启动时很容易检测到。如果性能有任何问题,这也不是一种选择。

    示例,我在所有这些示例中都使用了 mtime,因为这很难使用ls

    #!/bin/sh
    
    file="/etc/passwd"
    
    perl -e "print((stat(\"$file\"))[9])"
    echo
    
    echo "$file" | perl -e '$i = <STDIN>; chomp($i); print((stat($i))[9])'
    echo
    
    python -c "import os; print(os.stat(\"$file\").st_mtime, end='')"
    echo
    
    echo "$file" | python -c "import os, sys; print(os.stat(sys.stdin.readline()[:-1]).st_mtime, end='')"
    echo
    
    Run Code Online (Sandbox Code Playgroud)

    我会推荐 Perl 版本;不是因为我喜欢 Perl,而是因为这个 Python 示例仅适用于 Python 3(特别end='' 是防止打印换行符的位。同时使用 Python 2 和 3 的版本变得相当长:

     python2 -c "from __future__ import print_function; import os; print(os.stat('/etc/passwd') .st_mtime, end='')"
    
    Run Code Online (Sandbox Code Playgroud)

    您也可以使用其他语言(Ruby、PHP、Tcl 等)扩展它,但 Perl 和 Python 是迄今为止最流行的。

    文档: Perlstat()Perl lstat() Pythonos.stat()

  • @gavenkoa POSIX 非常保守;这很好,因为即使是“符合 POSIX 标准”的定义也不会改变得那么快,但它很糟糕,因为它缺少很多(例如 `stat`)... (2认同)