Linux

如何在 Linux 中獲取 2 個日期之間的差異?

  • November 19, 2019

我知道這是一個常見問題,但我不明白所提供的解決方案是如何工作的。每個人都建議將日期更改為從紀元開始的秒數,然後除以 (24 * 3600) 以獲得天數的差異。或使用

if [ $first_date -gt $second_date ]

但是,我不明白的是,為什麼沒有人注意到使用紀元中的秒數的明顯錯誤,因為即使在一天之內它們也會有所不同。或者,如果您考慮特定日期的下午 5:30 和第二天的上午 9:00,則秒之間的差異不會導致 24 小時的間隔,因此,它們會被錯誤地認為是相同的天。

我的使用場景是這樣的:我需要清除超過給定天數的日誌。因此,我在接受使用者輸入天數後形成的 expire_date 是:

expiration_date=$(date -d "-$1 day" + %s)

我通過使用 stat 命令獲得的文件修改日期如下:

file_date=$( stat -c %Y $entry )

如果文件修改日期“小於”到期日期,我需要比較這兩個日期並清除它們。請在這方面幫助我。

編輯

對於 find 命令的 mtime 參數的使用,我真的很困惑。假設我們有以下文件:

Nov15_1 Nov15_2 Nov17_1 Nov17_2 Nov18_1 Nov18_2 Nov19_1 Nov19_2

如果我現在在 11 月 19 日使用“0”作為 mtime 參數執行 find 命令,它將提供除前四個文件之外的所有文件。

find /dir/ -type f -mtime 0 -name "Nov*"

Nov18_1 Nov18_2 Nov19_1 Nov19_2

如果我使用“+0”執行它,它只會給我前四個文件。

find /dir/ -type f -mtime +0 -name "Nov*"

Nov15_1 Nov15_2 Nov17_1 Nov17_2

如果我們使用變數來表達這一點,說我們想從該月的第 n 天開始清除日誌,然後再往前清除,我們在第 (n+1) 天使用 mtime 作為 +0 執行命令,它應該轉換為“ 1 天回來和更遠”,它實際上是從第 (n-1) 天回來的文件,即從“2 天回來和更遠”。這是否意味著無法僅獲取 1 天前的文件並以某種方式進一步獲取文件?“0”的參數也將它與今天的文件混合在一起。

編輯

所以我合併了-daystart@AdminBee 指出的選項,結果符合我的預期。現在,如果我在第 (n+1) 天執行該命令,試圖刪除第 n 天或更早的日誌,該命令將是

find /dir/ -type f -daystart -mtime +0 -name "Nov*"

無論文件修改時間戳是否在從現在開始向後移動的 24 小時內,它現在都會將前一天的文件視為落後 1 天,並且還會列出它們之前的所有其他文件。

您可能需要提供有關實際案例的更多詳細資訊。我假設您每天都有一個清理腳本執行,並且想要刪除所有舊的文件,比如 5 天(所以從 6 天前或更早)。

find在這些情況下,您可以通過使用(這裡假設 GNUfind或兼容)將條件文件搜尋和刪除操作組合到一個命令中,如

find /start/of/logfile/dir/structure ! -type d -daystart -mtime +5 -delete

如果在當地時間 2019 年 11 月 16 日 22:54:12 執行,將刪除最後修改時間在 2019 年 11 月 11 日 00:00:00 之前的非目錄文件(因此是 10 號和更早的文件)。

請注意,-daystart此命令的選項find應該實現您想要的行為。如果您需要將操作限制為特定的文件名部分,則必須添加-name <pattern>(參見GNU 的文件find)。

另請注意,根據find您機器上安裝的版本,該-delete操作可能無法使用,因此您可能不得不使用-exec rm {} \;

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