bash date tricks
A quick usage note regarding the date util under bash. I sometimes want to convert between a unix timestamp and a formatted date string. I do it infrequently enough that I forget the syntax. This article is me writing down my notes.
In the following example, I want to get timestamps and date strings for both today and yesterday. Why yesterday’s date? Because I want to get yesterday’s data from google analytics’ data API. I’ve see numerous examples getting day, month and year then subtracting one from the day and propagating the underflow through the month and year. Blech! If I have today’s timestamp, I simply subtract a days worth of seconds from today and violĂ , yesterday!
#!/bin/bash # Generate a current unix timestamp # day=$(( `date +%s` )) # Adjust the timestamp above by 24 hours # seconds_in_a_day=$(( 24 * 60 * 60 )) yesterday=$(( day - seconds_in_a_day )) echo "timestamps" echo " day : ${day}" echo "yesterday : ${yesterday}" echo " " # create a formatted date string (linux) # #echo "linux formatted string" #echo " day : $( date -d @${day} '+%Y%m%d' )" #echo "yesterday : $( date -d @${yesterday} '+%Y-%m-%dT%H:%M:%S%Z' )" # create a formatted date string (bsd/mac) # echo "bsd/mac formatted string" echo " day : $( date -r ${day} '+%Y%m%d' )" echo "yesterday : $( date -r ${yesterday} '+%Y-%m-%dT%H:%M:%S%Z' )" # create a formatted date string (win) # # echo "windows formatted string" # echo "windows? really?" echo " " echo " "
Another example? Okay, let’s say I had a text file, foo, and I wanted to embed a date and get the checksum. Furthermore, I wanted the filename to include the timestamp corresponding to the embedded date. (bsd/mac version)
#!/bin/bash # scriptname: md5tagger # # generate a timestamp, # generate output filename # copy formatted date string to output file # cat original file to output file # copy the md5 sum to another output file # day=$( date +%s ) fname="$1-${day}" echo $( date -r ${day} ) >${fname} cat $1 >>${fname} md5 ${fname} >${fname}.md5
Let’s try it! (bsd/mac version)
$ printf "text to copy which\ncould be important\n" >foo $ ./md5tagger foo $ ll foo* -rw-r--r-- 1 kelly kelly 38 Aug 16 13:50 foo -rw-r--r-- 1 kelly kelly 67 Aug 16 13:51 foo-1250455870 -rw-r--r-- 1 kelly kelly 56 Aug 16 13:51 foo-1250455870.md5 $ cat foo text to copy which could be important $ cat foo-1250107720 Sun Aug 16 13:51:10 PDT 2009 text to copy which could be important $ md5 foo-1250455870; cat foo-1250455870.md5 MD5 (foo-1250455870) = 5cf4d9f274f05b63dfde5f15659cdeb8 MD5 (foo-1250455870) = 5cf4d9f274f05b63dfde5f15659cdeb8
With linux, you substitute md5sum for md5. Of course.
1 Comment
If you use the GNU date command you can simply tell it to subtract 1 day from a date. No need to calculate all those seconds! For example, the first line below will set variable “origtimestamp” to the current timestamp of the file “filename,” and the second line sets variable “newtimestamp” to that of “filename” less 1 day:
origtimestamp=”$(date -r filename +%c)”
newtimestamp=`date –date “$origtimestamp -1 day”`
If you want to update the timestamp and set it back one day, just use:
touch -d “$newtimestamp” filename
P.S. You can use this method to alter the any of the date’s units – seconds, minutes, hours, months or the year.
Kevin
2012.08.2206:58