POSIX模拟coreutils“stat”命令?

时间:2015-01-07 21:02:34

标签: shell posix stat gnu-coreutils

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

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

[ `stat -c '%U' $f` = $USER ] && echo "You own $f" || echo Error!

POSIX中是否有stat实用程序模拟?

2 个答案:

答案 0 :(得分:3)

简短的回答是没有,POSIX没有提供一种简单的方法来获得与stat相同的输出。但是,您通常可以使用其他工具获取相关位。具体到get the owner

ls -ld /path/of/file/or/directory | awk '{print $3}'

答案 1 :(得分:3)

不可能: - (

您的选择是:

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

  • 检测stat版本并切换参数; GNU stat有-f,BSD stat -c,其他版本可能是别的。 stat根本不在POSIX中,但我不知道它在Linux,BSD和OSX之外的普及程度如何。

  • 使用Perl或Python单行程序;这当然不是远程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
    

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

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

    您也可以使用其他语言(Ruby,PHP,Tcl等)扩展它,但Perl&amp;到目前为止,Python是最普遍的。

    文档: Perl stat()Perl lstat() Python os.stat()