2013-03-25 44 views
7

私はlinuxを使い慣れています。特定の日付範囲に日付を印刷して保存するにはどうすればよいですか?日付範囲の日付をlinux

たとえば、私はstartdate = 2013-03-01とenddate = 2013-03-25を持っています。私はその範囲内のすべての日付を印刷したいと思います。

、秒にあなたの日付を変換する少し数学を行うと、バック変換するために、事前

答えて

2

使用dateのおかげで:

#/bin/bash 

dstart=2013-03-01 
dend=2013-03-25 
# convert in seconds sinch the epoch: 
start=$(date -d$dstart +%s) 
end=$(date -d$dend +%s) 
cur=$start 

while [ $cur -le $end ]; do 
    # convert seconds to date: 
    date [email protected]$cur +%Y-%m-%d 
    let cur+=24*60*60 
done 

は日付パラメータの詳細はman dateを参照してください。..

11

として、日付がYYYY-MM-DD形式である限り、それらを辞書編集で比較し、最初に秒に変換せずにdateにカレンダーの計算をさせます:

startdate=2013-03-15 
enddate=2013-04-14 

curr="$startdate" 
while true; do 
    echo "$curr" 
    [ "$curr" \< "$enddate" ] || break 
    curr=$(date +%Y-%m-%d --date "$curr +1 day") 
done 

[ ... ]では、入力リダイレクション演算子との混同を避けるため、<をエスケープする必要があります。

これは、開始日が終了日よりも大きい場合は、開始日を印刷します。

+0

それでは、テスト後に ''エコー "$のCURR" を行います;) 。 'date --date" $ curr +1 day "'は 'let cur = ..'よりも良いです –

+0

安全であるためにはwhileループではなく、forループに入れた方がいいでしょう。スクリプト内でstartdateとenddateをパラメータ化する場合、ループの最大実行回数は366回または1000回です。これは無限にループしないようにします。 – ekangas

5

代替あなたが「最近」の日付をしたい場合は、次のとおりです。

echo {100..1} | xargs -I{} -d ' ' date --date={}' days ago' +"%Y-%m-%d" 

は明らかに、任意の日付範囲のために動作しません。

+0

これは私が考えている最良の答えの終わりです。私はそれを変更しました: $ startdate = '2016-03-01';エコー{0..10} | xargs -I {} -d "'date --date =" $ startdate + "{}" days "+"%Y-%m-%d " 2016-03-01 2016-03-02 2016- 03-03 .... – user5672998

0

別のオプションdateutilsからdateseqhttp://www.fresse.org/dateutils/#dateseq)を使用することです:

$ dateseq 2013-03-01 2013-03-25 
2013-03-01 
2013-03-02 
2013-03-03 
2013-03-04 
2013-03-05 
2013-03-06 
2013-03-07 
2013-03-08 
2013-03-09 
2013-03-10 
2013-03-11 
2013-03-12 
2013-03-13 
2013-03-14 
2013-03-15 
2013-03-16 
2013-03-17 
2013-03-18 
2013-03-19 
2013-03-20 
2013-03-21 
2013-03-22 
2013-03-23 
2013-03-24 
2013-03-25 
0

若干改善バージョン

#!/bin/bash 
startdate=2013-03-15 
enddate=2013-04-14 

curr="$startdate" 
while true; do 
    [ "$curr" \< "$enddate" ] || { echo "$curr"; break; } 
    echo "$curr" 
    curr=$(date +%Y-%m-%d --date "$curr +1 day") 
done