[英]How do I access a file for reading/writing in a different (non-current) directory?
[英]How do I get the bash date script to return a day of the week relative to a non-current time?
使用bash日期,我可以讓它返回相對於當前時間的一周中的某一天。
date --d='last Sunday' #Returns date of the Sunday before today
我還可以讓它返回相對於其他日期的一天
date --d='02/1/2012 -2 days' #Returns date two days before Feb. 1, 2012
但是,相對於某些非當前時間,我怎樣才能讓它返回星期幾呢? 我想做的是:
date --d='Sunday before 02/1/2012' #Doesn't work! I want Sunday before Feb. 1
如果可能的話,我甚至希望能夠鏈接字符串,以便我可以引用新日期的相對日期:
# Should return 2 days before the Sunday before Feb. 1, 2012
date --d='Sunday before 02/1/2012 - 2 days'
雖然這種鏈接並不重要。 bash日期是否有某種方式可以根據一周的相對日期返回一天?
你可以使用一個小數字算術:
base="02/1/2012"
feb1_dayofweek=$( date -d $base +%w )
target_dayofweek=0 # sunday
date -d "$base - $(( (7 + feb1_dayofweek - target_dayofweek) % 7 )) days"
結果:
Sun Jan 29 00:00:00 EST 2012
好吧,使用bash可以通過一些循環來完成(例如,將你希望用作Unix%s格式的變量的引用作為參考,而不是將其減去24 * 60 * 60,檢查它是否為星期日,如果它是真的則打印它...)
或者你可以用awk
設置這樣的東西
awk -v BASEDATE="2011 02 02" -v DIW="Sun" -v BEF="2"
'BEGIN { ct=BASEDATE " 00 00 00"
ct=mktime(ct)
while (strftime("%a",ct) != DIW) { ct-=24*60*60 }
ct-=BEF*24*60*60
print strftime("%Y-%m-%d %a",ct)
}'
你可以在這里看到它 。 幾乎。 由於ideone (我很喜歡)不允許將命令行變量傳遞給gawk
(或者我懶得想出來;-)),我不得不將它們嵌入到BEGIN
塊中。
如果你願意,可以將上面的內容轉換為datecalc.awk
(使用!#/usr/bin/gawk -f
腳本,它使用ARGV[n]
變量而不是-v
提供的變量,這樣你就可以從shell腳本中輕松調用它。
如果你安裝了libfaketime,這很容易做到。
export LD_PRELOAD=/usr/lib/libfaketime.so.1
$ FAKETIME='2012-02-01 00:00:00' date --d='last sunday'
Sun Jan 29 00:00:00 EST 2012
您可以通過動態設置FAKETIME來鏈接它。 這將變得混亂,但會起作用:
$ FAKETIME=$(FAKETIME='2012-02-01 00:00:00' date --d="last sunday" '+%Y-%m-%d %H:%M:%S') date --d="-2 days"
Fri Jan 27 00:00:00 EST 2012
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.