date 命令中的“1 個月前”選項如何工作?
我不確定這是否會在當天獲得過去的日期,或者是否只需要 30 或 31 天。
例如
如果目前日期是
March 28th
1 個月前,則必須是 1 個月前February 28th
,但是什麼時候會發生呢March 30th
?設想
我想每天備份一些文件,腳本會將這些文件保存在目前日期內,
$(date +%Y%m%d)
格式為,比如20150603_bckp.tar.gz
,然後當下個月到來時,刪除 1 個月前的所有文件,除了 1 號和 15 號的文件,所以這是我的條件:past_month = $(date -d "-1 month" +%Y%m%d) day = $(date +%d) if [ "$day" != 01 ] && [ "$day" != 15 ] then rm /path/of/files/${past_month}_bckp.tar.gz echo "Depuration done" else echo "Keep file" fi
但我想知道,當日期是 30 日、31 日甚至是過去的 2 月範例時會發生什麼?它會保留那些文件嗎?或刪除第一天的文件?
到 31 號時會執行清除,所以如果過去一個月只有 30 天,這會刪除第 1 天的文件嗎?
我希望我暗示了。
- 1 month
將從月份數中減去 1,然後如果生成的日期無效(February 30
例如 ),請調整它以使其有效。所以December 31 - 1 month
是December 1
,不是十一月的一天,March 31 - 1 month
而是March 3
(除非在閏年執行)。這是來自Gnu資訊頁面的引用
date
(這是date
實現此語法的版本),其中包括一個很好的建議,可以使算法更加健壯:單位中的模糊可能會導致相關項目出現問題。例如,
2003-07-31 -1 month
可能計算為 2003-07-01,因為 2003-06-31 是無效日期。為了更可靠地確定上個月,您可以要求當月 15 日之前的月份。例如:$ date -R Thu, 31 Jul 2003 13:02:39 -0700 $ date --date='-1 month' +'Last month was %B?' Last month was July? $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!' Last month was June!
另一個警告,也從資訊頁面引用:
此外,在圍繞時鐘變化(例如夏令時飛躍)操作日期時要小心。在少數情況下,它們會從時鐘中增加或減少多達 24 小時,因此 在開始日曆計算之前通過將
TZ
環境變數設置為來採用通用時間通常是明智的。UTC0