比较符号链接的时间

L. *_*rel 5 bash shell-script symlink timestamps

我想检查链接lnkfile是否比常规参考文件旧reffile。

bashtest内置解引用链接,因此test lnkfile -ot reffile比较 的目标lnkfile,而不是链接本身。

有没有办法让test内置不遵循符号链接?否则,我如何比较符号链接的时间?

Spa*_*awk 3

我不认为有办法使用test,但你可以使用find.

\n\n
test "$(find reffile -prune -newer lnkfile)" && command\n
Run Code Online (Sandbox Code Playgroud)\n\n

此处,如果早于find则返回输出。没有选项相当于. 如果字符串的长度非零,则这是正确的。因此,如果 中有输出,则执行。lnkfilereffiletesttest -nfindcommand

\n\n
\n\n

在评论中,我被要求对此解决方案与stat.. 首先,我发现这种stat方法非常好。

\n\n

我做了一个基准测试来比较。我交替重复测试几次,得到了相似的结果。

\n\n
$ time (for i in {1..1000}; do test "$(stat --format=%Z a)" -lt "$(stat --format=%Z b)" && echo foo > /dev/null ; done)\n\n================\nCPU 101%\nCPU 104%\nuser    1.264\nsystem  0.942\ntotal   2.108\n\n$ time (for i in {1..1000}; do test "$(find b -newer a)" && echo foo > /dev/null ; done)\n\n================\nCPU 104%\nuser    0.693\nsystem  0.526\ntotal   1.164\n
Run Code Online (Sandbox Code Playgroud)\n\n

我看起来find几乎快了一倍,也许是因为它是一个进程而不是两个进程stats?我不知道如何比较它们;如果您能想到其他相关方面,请发表评论。

\n\n

根据下面 St\xc3\xa9phane Chazelas\ 的评论,还有一些其他差异:

\n\n
\n

其他区别是:find一个是标准的。而stat需要 GNU 实现stat. 该stat方法不适用于同一秒内修改的文件(而find应该适用于支持时间戳亚秒粒度的系统)。既不find也不stat支持任意文件名。

\n\n

如果其中一个文件无法编辑,您会发现其他差异stat()。

\n
\n