Bash

比較符號連結的時間

  • January 23, 2019

我想檢查連結lnkfile是否比正常參考文件舊reffile

bashtest內置取消引用連結,因此test lnkfile -ot reffile比較的目標lnkfile,而不是連結本身。

有沒有辦法讓test內置不遵循符號連結?否則,我如何比較符號連結的時間?

我認為沒有辦法使用test,但您可以使用find.

test "$(find reffile -prune -newer lnkfile)" && command

在這裡,如果早於,find則返回輸出。沒有選項等同於. 如果字元串的長度不為零,則為真。因此,如果有來自 的輸出,則執行。lnkfile``reffile``test``test -n``find``command


在評論中,我被要求將這個解決方案與stat. 首先,我發現這種stat方法非常好。

我做了一個基準來比較。我重複了幾次測試,交替進行,得到了相似的結果。

$ time (for i in {1..1000}; do test "$(stat --format=%Z a)" -lt "$(stat --format=%Z b)" && echo foo > /dev/null ; done)

================
CPU 101%
CPU 104%
user    1.264
system  0.942
total   2.108

$ time (for i in {1..1000}; do test "$(find b -newer a)" && echo foo > /dev/null ; done)

================
CPU 104%
user    0.693
system  0.526
total   1.164

我看起來find幾乎快了一倍,也許是因為它是一個程序而不是兩個stats?我不確定如何比較它們;如果您能想到其他相關方面,請發表評論。

根據以下 Stéphane Chazelas 的評論,還有一些其他差異:

其他區別是:find一個是標準的。而stat一個需要stat. stat一個不適用於在同一秒內修改的文件(而應該find在支持時間戳的亞秒粒度的系統上工作)。既不find也不stat支持任意文件名。

如果無法stat()編輯任何一個文件,您會發現其他差異。

引用自:https://unix.stackexchange.com/questions/495864