I need create log files that are essentially date stamps with prefix yp_ and suffix .log, and a manipulated day number:

$ touch yp_$(echo "$(date +%Y%m%d)-10" | /usr/bin/bc -l).log
$ ls
yp_20150912.log   # ... ok for today's date.

That's fine for today, but all hell breaks loose when the day's number is between 01 and 10 included. The result cannot be interpreted as a date stamp any longer.

E.g. just imagine that the day is the 8th of March, 2016, i.e. '20160308'. How do I code the above to make sure that subtracting 10 days will produce not '20150298' but '20150227' ? Also test yr answer with 19820103 ...

-- I looked at man date.

-- apropos date spews out 161 hits that I also reviewed.

Can somebody help with that one-liner?

  • GNU date, out of interest?
    – bertieb
    Sep 22, 2015 at 16:20
  • @bertieb: Yup, GNU date it is. My first example IS a leap-year !
    – Cbhihe
    Sep 22, 2015 at 16:22
  • Welp, GNU date to the rescue then :)
    – bertieb
    Sep 22, 2015 at 16:27

2 Answers 2


I need to manipulate dates (whilst paying attention to leap years)

Fortunately, GNU date has a very handy -d option:

-d, --date=STRING
          display time described by STRING, not 'now'

(from man date)

This accepts arbitrary date descriptions, like "now + 1 year" "Jan 28 + 3 weeks"; or in your case: "now - 10 days":

touch yp_$(date -d 'now - 10 days' +%Y%m%d).log

No need for messy invocations of bc, no worrying about leap years- GNU date will handle it.

  • 1
    Right on. This is exactly what I had in mind AND I had seen that option on the man page, but had not understood its use. Thanks - PS: BTW the "land of rain and drink" could be a lot of places... any place north of me, actually. :))
    – Cbhihe
    Sep 22, 2015 at 20:07
  • @Cbhihe Glad it worked for you- it's an incredibly useful thing to know about (and a feature I miss when not available in other languages) :) PS about 55° N, and rain on more days than not- make of what what you will ;)
    – bertieb
    Sep 22, 2015 at 20:13

To display a formatted date for x-days from today:

$ echo $(date +%Y%m%d)

$ echo $(date -d -10days +%Y%m%d)

$ echo $(date -d +10days +%Y%m%d)
  • 2
    I liked the concision of your answer and the answer is dead right. But it just came after @bertieb 's own, which is equally right. So I can only upvote you. Tx Steven and sorry for that.
    – Cbhihe
    Sep 22, 2015 at 20:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.