Linux dateコマンドで「10分前を基準にした前月曜日」を取得できますか?
例えば
- 現在時刻:2016-02-09 00:05:00
- 予想される結果:2016-02-01 00:00:00
答え1
あなたが持っていて、faketime
あなたのものがdate
動的にリンクされている場合:
faketime -f -10m date -d 'last monday' '+%F %T'
使用ksh93
(組み込みコマンドのみ):
printf '%(%F %T)T\n' "$(printf '%(%Y.%m.%d)T' '10 minutes ago')-0 last monday"
ここが最後なら日曜日最後のものの代わりに月曜日に、次のようにすることができます。
date -d "$(date -d '10 minutes ago' +"%F -%u day")"
または最後の場合土曜日:
date -d "$(date -d '10 minutes ago' +"%F -%w day -1 day")"
しかし結局月曜日にまたは他の曜日には算術演算が必要です。
eval "date -d \"$(date -d '10 minutes ago' +'%F -$(((%u+5)%%7+1)) day')\""
それ以外の場合は、いつでも次のことができます。
d=$(date -d 'last monday'); sleep 600; printf '%s\n' "$d"
;-)
答え2
2つの日付操作でこれを行うことができます。以下は高速bashシェルスクリプトです:
TIME_TEN_MINUTES_AGO=`date -d '-10 min' +%T`
LAST_MON=`date -d 'last-monday' +%Y-%m-%d`
echo "NOW: " `date "+%Y-%m-%d %T"`
echo "Last Mon: " $LAST_MON $TIME_TEN_MINUTES_AGO
これは以下を印刷します:
NOW: 2016-02-12 07:54:27
Last Mon: 2016-02-08 07:44:27
答え3
同様の問題がありました。日付が与えられたら、先月曜日を見つけてください。
(テレビの放送日に番組のビデオファイル名を変更します。
DATE=$(youtube-dl -j $VID | awk -F\" '{print $28}')
)
私はmacOSでBSDを使用してdate
おり、GNUもインストールしましたdate
。
これがfaketime
この問題に対する最も簡単な解決策のようです。
faketime $DATE date -v-mon +%F
、
faketime $DATE gdate -d last-mon +%F
。
GNUを使用すると簡単に実行できますが、date
より複雑です。
eval "gdate -d \"$(gdate -d $DATE '+%D $[-%u+1] day')\" +%F"
。
date
汚れてもBSDのみを使用してこれを行うこともできます。
date -j -f "%a %d %b %Y %T %Z" "$(date -j -r \ "$(date -j -f "%Y%m%d" "$DATE" +"%s")" -v-mon)" +"%F"
。
答え4
ここ10分前が前日になる問題を解決する小さなスクリプトがあります。私はそれがよりエレガントにすることができると信じています。
#!/bin/bash
DAY=`date --date='-10 min' +"%a"`
SEC=`date --date='-10 min' +"%s"`
if [[ "$DAY" == "Mon" ]]; then
DDIF="7"
elif [[ "$DAY" == "Tue" ]]; then
DDIF="1"
elif [[ "$DAY" == "Wed" ]]; then
DDIF="2"
elif [[ "$DAY" == "Thu" ]]; then
DDIF="3"
elif [[ "$DAY" == "Fri" ]]; then
DDIF="4"
elif [[ "$DAY" == "Sat" ]]; then
DDIF="5"
elif [[ "$DAY" == "Sun" ]]; then
DDIF="6"
fi
EPOCH=$(awk "BEGIN {print $SEC-(86400*$DDIF); exit}")
date -d@"$EPOCH"
それがすることは、10分前がどんな曜日かを調べることです。月曜日まで数日残っているかどうかを確認してください。次に、その日数に86400(1日の秒数)を掛け、10分前を基準にしたEpochからそれを引きます。最後に、epoch値を標準形式に戻します。
私が言ったように、必ずしも単純、一行、またはエレガントである必要はありません。