2013-03-25 19 views
7

Sono nuovo di linux. Come posso stampare e memorizzare la data in un determinato intervallo di date.Stampa le date nell'intervallo di date linux

Ad esempio, ho startdate = 2013-03-01 e enddate = 2013-03-25; Voglio stampare tutte le date in quell'intervallo.

Grazie in anticipo

risposta

2

Usa date per convertire le date ai secondi, fare un po 'di matematica e convertire indietro:

#/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 

Vedi man date per ulteriori informazioni sui parametri di data ..

11

Come Finché le date sono nel formato AAAA-MM-GG, puoi confrontarle lessicograficamente e lasciare che lo date esegua l'aritmetica del calendario senza prima convertirlo in secondi:

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 

Con [ ... ], è necessario sfuggire allo < per evitare confusione con l'operatore di reindirizzamento dell'input.

Questo ha la verruca di stampare la data di inizio se è maggiore della data di fine.

+0

Quindi, basta fare il 'echo "$ curr"' dopo il test;) . 'date --date" $ curr +1 day "' è più bello di 'let cur = ..' –

+0

Probabilmente è meglio mettere questo in un ciclo for piuttosto che un ciclo while per essere sicuri. Se si parametrizza lo startdate e l'enddate all'interno di uno script, con il ciclo di esecuzione massimo di dire 366 volte o 1000 volte. Questo lo manterrà da loop infinito. – ekangas

5

Un supplente se si vuole 'recente' date è:

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

Ovviamente non funzionerà per intervalli di date arbitrarie.

+0

questo è vicino alla migliore risposta Penso, ho apportato una modifica: $ startdate = '2016-03-01'; echo {0..10} | xargs -I {} -d '' date --date = "$ startdate +" {} "giorni" + "% Y-% m-% d" 2016-03-01 2016-03-02 2016- 03-03 .... – user5672998

0

Un'altra opzione è quella di utilizzare dateseq da dateutils (http://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

Leggermente migliorata versione

#!/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