shell - coreutils "stat"命令的 POSIX 模拟?

标签 shell posix stat gnu-coreutils

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

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

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

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

最佳答案

这是不可能的:-(

您的选择是:

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

  • 检测stat版本并切换参数; GNU stat-cBSD stat-f,其他版本可能是别的。 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 和 3 的版本变得相当长:

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

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

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

关于shell - coreutils "stat"命令的 POSIX 模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27828585/

相关文章:

bash - 代码不适用于 sh -c,但直接适用于 sh

c - 拦截 stat()

c - 在没有 fopen 的情况下在 C 中读取二进制文件

c - 使用 posix_spawn 设置 euid

c - 向 stat() 添加几秒的偏移量

linux -/proc/pid/stat 文件中的 cstime 错误

linux - 复制最近 14 天内修改过的文件

c++ - 如何通过shell杀死父进程和子进程?

linux - 计算文件名与字符串匹配的目录中的文件

c++ - 调用 pthread_create() 时出现段错误 C++ Linux