POSIX coreutils "stat" 命令的模拟?
POSIX analog of coreutils "stat" command?
Coreutils stat
有 --format=
开关,它以简单的形式为读者报告关于文件的不同信息(所有者、大小等)。
POSIX ls
实用程序提供了大部分此类信息,但其输出难以解析。与单行比较:
[ `stat -c '%U' $f` = $USER ] && echo "You own $f" || echo Error!
POSIX 中是否有 stat
效用模拟?
简短的回答是没有,POSIX 没有提供获得与stat
相同输出的简单方法。但是,您通常可以使用其他工具获得相关信息。具体到get the owner:
ls -ld /path/of/file/or/directory | awk '{print }'
不可能:-(
您的选择是:
使用ls
并用awk
解析; ls -l
的输出在 POSIX 中,所以你
可以依靠那个。这适用于某些字段(例如您的所有者
例如),而对其他人(例如 mtime)不太好。
检测stat
版本并切换参数; GNU stat has -c
, BSD 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 是迄今为止使用最广泛的语言。
Coreutils stat
有 --format=
开关,它以简单的形式为读者报告关于文件的不同信息(所有者、大小等)。
POSIX ls
实用程序提供了大部分此类信息,但其输出难以解析。与单行比较:
[ `stat -c '%U' $f` = $USER ] && echo "You own $f" || echo Error!
POSIX 中是否有 stat
效用模拟?
简短的回答是没有,POSIX 没有提供获得与stat
相同输出的简单方法。但是,您通常可以使用其他工具获得相关信息。具体到get the owner:
ls -ld /path/of/file/or/directory | awk '{print }'
不可能:-(
您的选择是:
使用
ls
并用awk
解析;ls -l
的输出在 POSIX 中,所以你 可以依靠那个。这适用于某些字段(例如您的所有者 例如),而对其他人(例如 mtime)不太好。检测
stat
版本并切换参数; GNU stat has-c
, BSD 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 是迄今为止使用最广泛的语言。